fix:MCP成本计算规则调整
parent
671bbd5692
commit
5fb2faecdc
|
|
@ -244,7 +244,7 @@
|
||||||
<span class="stocking-product-meta__label">产品型号:</span>
|
<span class="stocking-product-meta__label">产品型号:</span>
|
||||||
<span class="stocking-product-meta__value stocking-product-meta__value--strong">{{ item.model || '-' }}</span>
|
<span class="stocking-product-meta__value stocking-product-meta__value--strong">{{ item.model || '-' }}</span>
|
||||||
<el-button
|
<el-button
|
||||||
v-if="item.vendorName && item.vendorName.startsWith('新华三')"
|
v-if="(item.vendorName && item.vendorName.startsWith('新华三')) || (item.productType != 1 && item.productType != 2)"
|
||||||
type="primary"
|
type="primary"
|
||||||
plain
|
plain
|
||||||
icon="el-icon-plus"
|
icon="el-icon-plus"
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<el-table v-loading="loading" :data="logList">
|
<el-table v-loading="loading" :data="logList">
|
||||||
<el-table-column label="入库单号" align="center" prop="innerCode" />
|
<el-table-column label="入库单号" align="center" prop="innerCode" width="150" />
|
||||||
<el-table-column label="产品编码" align="center" prop="productCode" />
|
<el-table-column label="产品编码" align="center" prop="productCode" width="150" />
|
||||||
<el-table-column label="产品型号" align="center" prop="model" />
|
<el-table-column label="产品型号" align="center" prop="model" />
|
||||||
<el-table-column label="入库数量" align="center" prop="quantity" />
|
<el-table-column label="入库数量" align="center" prop="quantity" width="100" />
|
||||||
<el-table-column label="制造商" align="center" prop="vendorName" />
|
<el-table-column label="制造商" align="center" prop="vendorName" />
|
||||||
<el-table-column label="入库仓" align="center" prop="warehouseName" />
|
<el-table-column label="入库仓" align="center" prop="warehouseName" width="120" />
|
||||||
<el-table-column label="经办人" align="center" prop="createByName" />
|
<el-table-column label="经办人" align="center" prop="createByName" width="120" />
|
||||||
<el-table-column label="入库时间" align="center" prop="createTime" width="180">
|
<el-table-column label="入库时间" align="center" prop="createTime" width="180">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<el-table v-loading="loading" :data="logList">
|
<el-table v-loading="loading" :data="logList">
|
||||||
<el-table-column label="出库单号" align="center" prop="outerCode" />
|
<el-table-column label="出库单号" align="center" prop="outerCode" width="150" />
|
||||||
<el-table-column label="合同编号" align="center" prop="orderCode" />
|
<el-table-column label="合同编号" align="center" prop="orderCode" />
|
||||||
<el-table-column label="项目名称" align="center" prop="projectName" show-overflow-tooltip />
|
<el-table-column label="项目名称" align="center" prop="projectName" show-overflow-tooltip />
|
||||||
<el-table-column label="数量" align="center" prop="quantity" />
|
<el-table-column label="数量" align="center" prop="quantity" width="100" />
|
||||||
<el-table-column label="出库状态" align="center" prop="outerStatus">
|
<el-table-column label="出库状态" align="center" prop="outerStatus" width="120">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<dict-tag :options="outerStatusOptions" :value="scope.row.outerStatus"/>
|
<dict-tag :options="outerStatusOptions" :value="scope.row.outerStatus"/>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="经办人" align="center" prop="createByName" />
|
<el-table-column label="经办人" align="center" prop="createByName" width="120" />
|
||||||
<el-table-column label="出库时间" align="center" prop="createTime" width="180">
|
<el-table-column label="出库时间" align="center" prop="createTime" width="180">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span>{{ parseTime(scope.row.createTime) }}</span>
|
<span>{{ parseTime(scope.row.createTime) }}</span>
|
||||||
|
|
|
||||||
|
|
@ -383,7 +383,7 @@ export default {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.form.inventoryInfoList=[]
|
this.form.inventoryInfoList=[]
|
||||||
let quantity = Number(this.form.quantity);
|
let quantity = Number(this.form.quantity) - Number(this.form.innerQuantity || 0);
|
||||||
let productSn = this.inputSn;
|
let productSn = this.inputSn;
|
||||||
let snPrefix = "";
|
let snPrefix = "";
|
||||||
let snNumber = "";
|
let snNumber = "";
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
<el-dialog :title="title" :close-on-click-modal="false" :visible.sync="visible" width="80%" append-to-body @close="handleClose">
|
<el-dialog :title="title" :close-on-click-modal="false" :visible.sync="visible" width="80%" append-to-body @close="handleClose">
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="120px">
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="120px">
|
||||||
<el-form-item label="采购单号" prop="purchaseNo">
|
<el-form-item label="采购单号123" prop="purchaseNo">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.purchaseNo"
|
v-model="queryParams.purchaseNo"
|
||||||
placeholder="请输入采购单号"
|
placeholder="请输入采购单号"
|
||||||
|
|
@ -55,7 +55,7 @@
|
||||||
<el-table-column label="单价" align="center" prop="price" width="100"/>
|
<el-table-column label="单价" align="center" prop="price" width="100"/>
|
||||||
<el-table-column label="小计" align="center" prop="price" width="100">
|
<el-table-column label="小计" align="center" prop="price" width="100">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ scope.row.quantity * scope.row.price}}
|
{{ ((Number(scope.row.quantity) || 0) * (Number(scope.row.price) || 0)).toFixed(2) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|
@ -129,6 +129,8 @@ export default {
|
||||||
watch: {
|
watch: {
|
||||||
visible(val) {
|
visible(val) {
|
||||||
if (val) {
|
if (val) {
|
||||||
|
this.queryParams.type = this.type;
|
||||||
|
this.queryParams.productCode = this.productCode;
|
||||||
this.getList();
|
this.getList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.ruoyi.sip.dto;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class OrderProductBindAmountDto {
|
||||||
|
|
||||||
|
/** 产品编码 */
|
||||||
|
private String productCode;
|
||||||
|
|
||||||
|
/** 成本含税 */
|
||||||
|
private BigDecimal costWithTax;
|
||||||
|
|
||||||
|
/** 成本不含税 */
|
||||||
|
private BigDecimal costWithoutTax;
|
||||||
|
|
||||||
|
/** 不含税收入 */
|
||||||
|
private BigDecimal amountWithoutTax;
|
||||||
|
|
||||||
|
/** 毛利 */
|
||||||
|
private BigDecimal grossProfit;
|
||||||
|
|
||||||
|
/** 毛利率 */
|
||||||
|
private BigDecimal grossProfitRate;
|
||||||
|
|
||||||
|
/** 订单备货状态(true: 已备货完成,false: 未备货完成) */
|
||||||
|
private Boolean orderStockingStatus;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package com.ruoyi.sip.dto;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class UnboundPurchaseOrderProductDto {
|
||||||
|
|
||||||
|
/** 合同编号 */
|
||||||
|
private String orderCode;
|
||||||
|
|
||||||
|
/** 产品编码 */
|
||||||
|
private String productCode;
|
||||||
|
|
||||||
|
/** 入库单号 */
|
||||||
|
private String innerCode;
|
||||||
|
}
|
||||||
|
|
@ -12,11 +12,9 @@ import com.ruoyi.sip.domain.OmsReceivableBill;
|
||||||
import com.ruoyi.sip.domain.ProjectInfo;
|
import com.ruoyi.sip.domain.ProjectInfo;
|
||||||
import com.ruoyi.sip.domain.ProjectOrderInfo;
|
import com.ruoyi.sip.domain.ProjectOrderInfo;
|
||||||
import com.ruoyi.sip.domain.ProjectProductInfo;
|
import com.ruoyi.sip.domain.ProjectProductInfo;
|
||||||
|
import com.ruoyi.sip.dto.OrderProductBindAmountDto;
|
||||||
import com.ruoyi.sip.llm.tools.support.AbstractMcpToolProvider;
|
import com.ruoyi.sip.llm.tools.support.AbstractMcpToolProvider;
|
||||||
import com.ruoyi.sip.mapper.InventoryInfoMapper;
|
import com.ruoyi.sip.mapper.*;
|
||||||
import com.ruoyi.sip.mapper.OmsInventoryInnerMapper;
|
|
||||||
import com.ruoyi.sip.mapper.OmsPurchaseOrderMapper;
|
|
||||||
import com.ruoyi.sip.mapper.ProjectInfoMapper;
|
|
||||||
import com.ruoyi.sip.service.IInventoryInfoService;
|
import com.ruoyi.sip.service.IInventoryInfoService;
|
||||||
import com.ruoyi.sip.service.IInventoryOuterService;
|
import com.ruoyi.sip.service.IInventoryOuterService;
|
||||||
import com.ruoyi.sip.service.IOmsReceivableBillService;
|
import com.ruoyi.sip.service.IOmsReceivableBillService;
|
||||||
|
|
@ -43,7 +41,7 @@ public class ProjectOrderInfoToolProvider extends AbstractMcpToolProvider {
|
||||||
private static final String INDUSTRY_TYPE_DICT_TYPE = "bg_hysy";
|
private static final String INDUSTRY_TYPE_DICT_TYPE = "bg_hysy";
|
||||||
private static final String INDUSTRY_TYPE_YYS_DICT_TYPE = "bg_yys";
|
private static final String INDUSTRY_TYPE_YYS_DICT_TYPE = "bg_yys";
|
||||||
private static final String PROJECT_STAGE_DICT_TYPE = "project_stage";
|
private static final String PROJECT_STAGE_DICT_TYPE = "project_stage";
|
||||||
private static final String NOT_DELIVERED_TEXT = "未发货完成";
|
private static final String NOT_DELIVERED_TEXT = "未配货完成";
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private IProjectOrderInfoService projectOrderInfoService;
|
private IProjectOrderInfoService projectOrderInfoService;
|
||||||
|
|
@ -72,6 +70,9 @@ public class ProjectOrderInfoToolProvider extends AbstractMcpToolProvider {
|
||||||
@Autowired
|
@Autowired
|
||||||
private IOmsReceivableBillService omsReceivableBillService;
|
private IOmsReceivableBillService omsReceivableBillService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ProjectOrderInfoMapper projectOrderInfoMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected String getToolName() {
|
protected String getToolName() {
|
||||||
return "project_order_info";
|
return "project_order_info";
|
||||||
|
|
@ -195,11 +196,11 @@ public class ProjectOrderInfoToolProvider extends AbstractMcpToolProvider {
|
||||||
item.put("archiveTime", formatDateTime(orderInfo.getApproveTime()));
|
item.put("archiveTime", formatDateTime(orderInfo.getApproveTime()));
|
||||||
|
|
||||||
ProductGroupSummary softwareSummary = appendProductFields(item, "software", softwareList,
|
ProductGroupSummary softwareSummary = appendProductFields(item, "software", softwareList,
|
||||||
orderShipmentMap, Collections.emptyMap(), true);
|
orderShipmentMap, Collections.emptyMap(), true, orderInfo.getOrderCode());
|
||||||
ProductGroupSummary hardwareSummary = appendProductFields(item, "hardware", hardwareList,
|
ProductGroupSummary hardwareSummary = appendProductFields(item, "hardware", hardwareList,
|
||||||
orderShipmentMap, Collections.emptyMap(), true);
|
orderShipmentMap, Collections.emptyMap(), true, orderInfo.getOrderCode());
|
||||||
ProductGroupSummary serviceSummary = appendProductFields(item, "service", serviceList,
|
ProductGroupSummary serviceSummary = appendProductFields(item, "service", serviceList,
|
||||||
Collections.emptyMap(), serviceCostMap.getOrDefault(orderInfo.getOrderCode(), Collections.emptyMap()), false);
|
Collections.emptyMap(), serviceCostMap.getOrDefault(orderInfo.getOrderCode(), Collections.emptyMap()), false, orderInfo.getOrderCode());
|
||||||
|
|
||||||
BigDecimal orderAmountWithTax = defaultValue(orderInfo.getShipmentAmount());
|
BigDecimal orderAmountWithTax = defaultValue(orderInfo.getShipmentAmount());
|
||||||
BigDecimal discountAmountWithTax = softwareSummary.salesWithTax
|
BigDecimal discountAmountWithTax = softwareSummary.salesWithTax
|
||||||
|
|
@ -208,20 +209,21 @@ public class ProjectOrderInfoToolProvider extends AbstractMcpToolProvider {
|
||||||
BigDecimal discountAmountWithoutTax = softwareSummary.salesWithoutTax
|
BigDecimal discountAmountWithoutTax = softwareSummary.salesWithoutTax
|
||||||
.add(hardwareSummary.salesWithoutTax)
|
.add(hardwareSummary.salesWithoutTax)
|
||||||
.add(serviceSummary.salesWithoutTax);
|
.add(serviceSummary.salesWithoutTax);
|
||||||
boolean allDelivered = softwareSummary.allDelivered && hardwareSummary.allDelivered && serviceSummary.allDelivered;
|
boolean allStocked = softwareSummary.allStocked && hardwareSummary.allStocked && serviceSummary.allStocked;
|
||||||
BigDecimal costWithTax = softwareSummary.costWithTax.add(hardwareSummary.costWithTax).add(serviceSummary.costWithTax);
|
BigDecimal costWithTax = softwareSummary.costWithTax.add(hardwareSummary.costWithTax).add(serviceSummary.costWithTax);
|
||||||
BigDecimal costWithoutTax = softwareSummary.costWithoutTax.add(hardwareSummary.costWithoutTax).add(serviceSummary.costWithoutTax);
|
BigDecimal costWithoutTax = softwareSummary.costWithoutTax.add(hardwareSummary.costWithoutTax).add(serviceSummary.costWithoutTax);
|
||||||
|
|
||||||
item.put("orderAmountWithTax", orderAmountWithTax);
|
item.put("orderAmountWithTax", orderAmountWithTax);
|
||||||
item.put("discountedOrderAmountWithTax", discountAmountWithTax);
|
item.put("discountedOrderAmountWithTax", discountAmountWithTax);
|
||||||
item.put("discountedOrderAmountWithoutTax", discountAmountWithoutTax);
|
item.put("discountedOrderAmountWithoutTax", discountAmountWithoutTax);
|
||||||
item.put("costTotalWithTax", allDelivered ? costWithTax : NOT_DELIVERED_TEXT);
|
item.put("costTotalWithTax", allStocked ? costWithTax : NOT_DELIVERED_TEXT);
|
||||||
item.put("costTotalWithoutTax", allDelivered ? costWithoutTax : NOT_DELIVERED_TEXT);
|
item.put("costTotalWithoutTax", allStocked ? costWithoutTax : NOT_DELIVERED_TEXT);
|
||||||
|
|
||||||
if (allDelivered) {
|
if (allStocked) {
|
||||||
BigDecimal grossProfit = discountAmountWithoutTax.subtract(costWithoutTax);
|
BigDecimal totalGrossProfit = softwareSummary.grossProfit.add(hardwareSummary.grossProfit).add(serviceSummary.grossProfit);
|
||||||
item.put("grossProfit", grossProfit);
|
BigDecimal totalAmountWithoutTax = softwareSummary.amountWithoutTax.add(hardwareSummary.amountWithoutTax).add(serviceSummary.amountWithoutTax);
|
||||||
item.put("grossProfitRate", percentage(grossProfit, costWithoutTax));
|
item.put("grossProfit", totalGrossProfit);
|
||||||
|
item.put("grossProfitRate", percentage(totalGrossProfit, totalAmountWithoutTax));
|
||||||
} else {
|
} else {
|
||||||
item.put("grossProfit", NOT_DELIVERED_TEXT);
|
item.put("grossProfit", NOT_DELIVERED_TEXT);
|
||||||
item.put("grossProfitRate", NOT_DELIVERED_TEXT);
|
item.put("grossProfitRate", NOT_DELIVERED_TEXT);
|
||||||
|
|
@ -501,7 +503,8 @@ public class ProjectOrderInfoToolProvider extends AbstractMcpToolProvider {
|
||||||
List<ProjectProductInfo> productInfos,
|
List<ProjectProductInfo> productInfos,
|
||||||
Map<String, ProductShipmentSummary> shipmentMap,
|
Map<String, ProductShipmentSummary> shipmentMap,
|
||||||
Map<String, ProductCostSummary> serviceCostMap,
|
Map<String, ProductCostSummary> serviceCostMap,
|
||||||
boolean shipmentRequired) {
|
boolean shipmentRequired,
|
||||||
|
String orderCode) {
|
||||||
ProductGroupSummary summary = new ProductGroupSummary();
|
ProductGroupSummary summary = new ProductGroupSummary();
|
||||||
if (CollUtil.isEmpty(productInfos)) {
|
if (CollUtil.isEmpty(productInfos)) {
|
||||||
return summary;
|
return summary;
|
||||||
|
|
@ -509,9 +512,29 @@ public class ProjectOrderInfoToolProvider extends AbstractMcpToolProvider {
|
||||||
for (int i = 0; i < productInfos.size(); i++) {
|
for (int i = 0; i < productInfos.size(); i++) {
|
||||||
int index = i + 1;
|
int index = i + 1;
|
||||||
ProjectProductInfo productInfo = productInfos.get(i);
|
ProjectProductInfo productInfo = productInfos.get(i);
|
||||||
ProductCostDisplay costDisplay = shipmentRequired
|
|
||||||
? buildShipmentProductCostDisplay(productInfo, shipmentMap.get(productInfo.getProductBomCode()))
|
OrderProductBindAmountDto bindAmountDto = projectOrderInfoMapper.selectOrderProductBindAmount(
|
||||||
: buildServiceProductCostDisplay(serviceCostMap.get(productInfo.getProductBomCode()));
|
orderCode, productInfo.getProductBomCode());
|
||||||
|
|
||||||
|
ProductCostDisplay costDisplay = new ProductCostDisplay();
|
||||||
|
if (bindAmountDto != null) {
|
||||||
|
costDisplay.delivered = bindAmountDto.getOrderStockingStatus() != null && bindAmountDto.getOrderStockingStatus();
|
||||||
|
costDisplay.costWithTax = defaultValue(bindAmountDto.getCostWithTax());
|
||||||
|
costDisplay.costWithoutTax = defaultValue(bindAmountDto.getCostWithoutTax());
|
||||||
|
costDisplay.displayValue = costDisplay.costWithTax;
|
||||||
|
|
||||||
|
summary.amountWithoutTax = summary.amountWithoutTax.add(defaultValue(bindAmountDto.getAmountWithoutTax()));
|
||||||
|
summary.grossProfit = summary.grossProfit.add(defaultValue(bindAmountDto.getGrossProfit()));
|
||||||
|
summary.grossProfitRate = defaultValue(bindAmountDto.getGrossProfitRate());
|
||||||
|
summary.orderStockingStatus = bindAmountDto.getOrderStockingStatus();
|
||||||
|
if (bindAmountDto.getOrderStockingStatus() == null || !bindAmountDto.getOrderStockingStatus()) {
|
||||||
|
summary.allStocked = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
costDisplay.delivered = false;
|
||||||
|
costDisplay.displayValue = NOT_DELIVERED_TEXT;
|
||||||
|
summary.allStocked = false;
|
||||||
|
}
|
||||||
|
|
||||||
item.put(prefix + "Code" + index, productInfo.getProductBomCode());
|
item.put(prefix + "Code" + index, productInfo.getProductBomCode());
|
||||||
item.put(prefix + "Level2Type" + index, productInfo.getLevel2Type());
|
item.put(prefix + "Level2Type" + index, productInfo.getLevel2Type());
|
||||||
|
|
@ -520,6 +543,9 @@ public class ProjectOrderInfoToolProvider extends AbstractMcpToolProvider {
|
||||||
item.put(prefix + "SalesAmount" + index, defaultValue(productInfo.getAllPrice()));
|
item.put(prefix + "SalesAmount" + index, defaultValue(productInfo.getAllPrice()));
|
||||||
item.put(prefix + "CostAmount" + index, costDisplay.displayValue);
|
item.put(prefix + "CostAmount" + index, costDisplay.displayValue);
|
||||||
item.put(prefix + "TaxRate" + index, productInfo.getTaxRate());
|
item.put(prefix + "TaxRate" + index, productInfo.getTaxRate());
|
||||||
|
item.put(prefix + "GrossProfit" + index, bindAmountDto != null ? defaultValue(bindAmountDto.getGrossProfit()) : BigDecimal.ZERO);
|
||||||
|
item.put(prefix + "GrossProfitRate" + index, bindAmountDto != null ? defaultValue(bindAmountDto.getGrossProfitRate()) : BigDecimal.ZERO);
|
||||||
|
item.put(prefix + "OrderStockingStatus" + index, bindAmountDto != null ? bindAmountDto.getOrderStockingStatus() : false);
|
||||||
|
|
||||||
summary.salesWithTax = summary.salesWithTax.add(defaultValue(productInfo.getAllPrice()));
|
summary.salesWithTax = summary.salesWithTax.add(defaultValue(productInfo.getAllPrice()));
|
||||||
summary.salesWithoutTax = summary.salesWithoutTax.add(toOrderAmountWithoutTax(defaultValue(productInfo.getAllPrice()), productInfo.getTaxRate()));
|
summary.salesWithoutTax = summary.salesWithoutTax.add(toOrderAmountWithoutTax(defaultValue(productInfo.getAllPrice()), productInfo.getTaxRate()));
|
||||||
|
|
@ -705,7 +731,7 @@ public class ProjectOrderInfoToolProvider extends AbstractMcpToolProvider {
|
||||||
"softwareCodeX", "软件产品第 X 行编码,对应 softwareLevel2TypeX/softwareModelX/softwareQuantityX/softwareSalesAmountX/softwareCostAmountX/softwareTaxRateX",
|
"softwareCodeX", "软件产品第 X 行编码,对应 softwareLevel2TypeX/softwareModelX/softwareQuantityX/softwareSalesAmountX/softwareCostAmountX/softwareTaxRateX",
|
||||||
"hardwareCodeX", "硬件产品第 X 行编码,对应 hardwareLevel2TypeX/hardwareModelX/hardwareQuantityX/hardwareSalesAmountX/hardwareCostAmountX/hardwareTaxRateX",
|
"hardwareCodeX", "硬件产品第 X 行编码,对应 hardwareLevel2TypeX/hardwareModelX/hardwareQuantityX/hardwareSalesAmountX/hardwareCostAmountX/hardwareTaxRateX",
|
||||||
"serviceCodeX", "服务产品第 X 行编码,对应 serviceLevel2TypeX/serviceModelX/serviceQuantityX/serviceSalesAmountX/serviceCostAmountX/serviceTaxRateX",
|
"serviceCodeX", "服务产品第 X 行编码,对应 serviceLevel2TypeX/serviceModelX/serviceQuantityX/serviceSalesAmountX/serviceCostAmountX/serviceTaxRateX",
|
||||||
"cost_rule", "软件和硬件未发货完成时成本字段返回“未发货完成”;服务默认视为已完成;订单不含税成本为各产品按各自税率换算后求和"
|
"cost_rule", "所有产品未配货完成时成本字段返回“未配货完成”;订单不含税成本为各产品按各自税率换算后求和"
|
||||||
));
|
));
|
||||||
return metadata;
|
return metadata;
|
||||||
}
|
}
|
||||||
|
|
@ -813,10 +839,15 @@ public class ProjectOrderInfoToolProvider extends AbstractMcpToolProvider {
|
||||||
|
|
||||||
private static class ProductGroupSummary {
|
private static class ProductGroupSummary {
|
||||||
private boolean allDelivered = true;
|
private boolean allDelivered = true;
|
||||||
|
private boolean allStocked = true;
|
||||||
private BigDecimal salesWithTax = BigDecimal.ZERO;
|
private BigDecimal salesWithTax = BigDecimal.ZERO;
|
||||||
private BigDecimal salesWithoutTax = BigDecimal.ZERO;
|
private BigDecimal salesWithoutTax = BigDecimal.ZERO;
|
||||||
|
private BigDecimal amountWithoutTax = BigDecimal.ZERO;
|
||||||
private BigDecimal costWithTax = BigDecimal.ZERO;
|
private BigDecimal costWithTax = BigDecimal.ZERO;
|
||||||
private BigDecimal costWithoutTax = BigDecimal.ZERO;
|
private BigDecimal costWithoutTax = BigDecimal.ZERO;
|
||||||
|
private BigDecimal grossProfit = BigDecimal.ZERO;
|
||||||
|
private BigDecimal grossProfitRate = BigDecimal.ZERO;
|
||||||
|
private Boolean orderStockingStatus = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ReceivableSummary {
|
private static class ReceivableSummary {
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,12 @@ import java.util.List;
|
||||||
import com.ruoyi.sip.domain.InventoryDelivery;
|
import com.ruoyi.sip.domain.InventoryDelivery;
|
||||||
import com.ruoyi.sip.domain.ProjectOrderInfo;
|
import com.ruoyi.sip.domain.ProjectOrderInfo;
|
||||||
import com.ruoyi.sip.dto.HomepageQueryDto;
|
import com.ruoyi.sip.dto.HomepageQueryDto;
|
||||||
|
import com.ruoyi.sip.dto.OrderProductBindAmountDto;
|
||||||
import com.ruoyi.sip.dto.OrderProductMatchBindDto;
|
import com.ruoyi.sip.dto.OrderProductMatchBindDto;
|
||||||
import com.ruoyi.sip.dto.OrderProductMatchDto;
|
import com.ruoyi.sip.dto.OrderProductMatchDto;
|
||||||
import com.ruoyi.sip.dto.OrderProductMatchSnDetailDto;
|
import com.ruoyi.sip.dto.OrderProductMatchSnDetailDto;
|
||||||
import com.ruoyi.sip.dto.StatisticsDetailDto;
|
import com.ruoyi.sip.dto.StatisticsDetailDto;
|
||||||
|
import com.ruoyi.sip.dto.UnboundPurchaseOrderProductDto;
|
||||||
import com.ruoyi.sip.vo.OrderInfoVo;
|
import com.ruoyi.sip.vo.OrderInfoVo;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
|
@ -113,4 +115,9 @@ public interface ProjectOrderInfoMapper
|
||||||
List<OrderProductMatchSnDetailDto> selectProductMatchSnDetailList(@Param("purchaseNo") String purchaseNo,
|
List<OrderProductMatchSnDetailDto> selectProductMatchSnDetailList(@Param("purchaseNo") String purchaseNo,
|
||||||
@Param("productCode") String productCode);
|
@Param("productCode") String productCode);
|
||||||
|
|
||||||
|
OrderProductBindAmountDto selectOrderProductBindAmount(@Param("orderCode") String orderCode,
|
||||||
|
@Param("productCode") String productCode);
|
||||||
|
|
||||||
|
List<UnboundPurchaseOrderProductDto> selectUnboundPurchaseOrderProductList();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -951,7 +951,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
) t6 on t3.product_code = t6.product_code
|
) t6 on t3.product_code = t6.product_code
|
||||||
left join oms_vendor_info as t7 on t3.vendor_code = t7.vendor_code
|
left join oms_vendor_info as t7 on t3.vendor_code = t7.vendor_code
|
||||||
where t2.order_code = #{orderCode}
|
where t2.order_code = #{orderCode}
|
||||||
and t3.type in (1, 2)
|
|
||||||
group by t3.product_code, t3.model
|
group by t3.product_code, t3.model
|
||||||
order by t3.type, t3.product_code
|
order by t3.type, t3.product_code
|
||||||
</select>
|
</select>
|
||||||
|
|
@ -1026,13 +1025,53 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
t1.order_code,
|
t1.order_code,
|
||||||
t1.outer_code
|
t1.outer_code
|
||||||
from oms_inventory_info as t1
|
from oms_inventory_info as t1
|
||||||
inner join oms_inventory_inner as t2
|
inner join oms_inventory_inner as t2 on t1.inner_code = t2.inner_code
|
||||||
on t1.inner_code = t2.inner_code
|
left join oms_warehouse_info as t3 on t2.warehouse_id = t3.id
|
||||||
left join oms_warehouse_info as t3
|
|
||||||
on t2.warehouse_id = t3.id
|
|
||||||
where t2.purchase_no = #{purchaseNo}
|
where t2.purchase_no = #{purchaseNo}
|
||||||
and t1.product_code = #{productCode}
|
and t1.product_code = #{productCode}
|
||||||
order by t1.product_sn
|
order by t1.product_sn
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectOrderProductBindAmount" resultType="com.ruoyi.sip.dto.OrderProductBindAmountDto">
|
||||||
|
select
|
||||||
|
product_code,
|
||||||
|
sum(cost_with_tax) as cost_with_tax,
|
||||||
|
sum(cost_without_tax) as cost_without_tax,
|
||||||
|
sum(amount_without_tax) as amount_without_tax,
|
||||||
|
sum(amount_without_tax) - sum(cost_without_tax) as gross_profit,
|
||||||
|
cast((sum(amount_without_tax) - sum(t.cost_without_tax)) / sum(amount_without_tax) * 100 as decimal(10,2)) as gross_profit_rate,
|
||||||
|
(case when sum(bind_num) >= max(quantity) then true else false end) as order_stocking_status
|
||||||
|
from (
|
||||||
|
select
|
||||||
|
t1.project_id,
|
||||||
|
t2.product_code,
|
||||||
|
t2.bind_num * t4.price as cost_with_tax,
|
||||||
|
cast(t2.bind_num * t4.price / (1 + t4.tax_rate) as decimal(10,2)) as cost_without_tax,
|
||||||
|
cast(t2.bind_num * t5.price / (1 + t5.tax_rate / 100) as decimal(10,2)) as amount_without_tax,
|
||||||
|
t2.bind_num,
|
||||||
|
t5.quantity
|
||||||
|
from project_order_info as t1
|
||||||
|
inner join oms_purchase_order_map as t2 on t1.id = t2.order_id
|
||||||
|
inner join oms_purchase_order as t3 on t2.purchase_id = t3.id
|
||||||
|
inner join oms_purchase_order_item as t4 on t3.id = t4.purchase_id and t2.product_code = t4.product_code
|
||||||
|
inner join project_product_info as t5 on t1.project_id = t5.project_id and t2.product_code = t5.product_bom_code
|
||||||
|
where t2.bind_num > 0
|
||||||
|
and t1.order_code = #{orderCode}
|
||||||
|
and t2.product_code = #{productCode}
|
||||||
|
) as t
|
||||||
|
group by product_code
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectUnboundPurchaseOrderProductList" resultType="com.ruoyi.sip.dto.UnboundPurchaseOrderProductDto">
|
||||||
|
select
|
||||||
|
t1.order_code,
|
||||||
|
t1.product_code,
|
||||||
|
t1.inner_code
|
||||||
|
from oms_inventory_info as t1
|
||||||
|
inner join project_order_info as t2
|
||||||
|
on t1.order_code = t2.order_code
|
||||||
|
where t2.id not in (select order_id from oms_purchase_order_map)
|
||||||
|
group by t1.order_code, t1.product_code, t1.inner_code
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue