Commit 80d0edd1f9a1f42d4feb852e53bf1c766741d0aa

Authored by 房远帅
1 parent 4de68f88

报表:库存入库订单明细报表2

@@ -4,13 +4,19 @@ import com.fasterxml.jackson.annotation.JsonFormat; @@ -4,13 +4,19 @@ import com.fasterxml.jackson.annotation.JsonFormat;
4 import java.math.BigDecimal; 4 import java.math.BigDecimal;
5 import com.lframework.starter.common.constants.StringPool; 5 import com.lframework.starter.common.constants.StringPool;
6 import com.lframework.starter.web.core.bo.BaseBo; 6 import com.lframework.starter.web.core.bo.BaseBo;
  7 +import com.lframework.starter.web.core.utils.ApplicationUtil;
  8 +import com.lframework.starter.web.inner.entity.SysDataDicItem;
  9 +import com.lframework.starter.web.inner.service.system.SysDataDicItemService;
7 import java.time.LocalDate; 10 import java.time.LocalDate;
8 import java.time.LocalDateTime; 11 import java.time.LocalDateTime;
  12 +import java.util.Map;
  13 +import java.util.concurrent.ConcurrentHashMap;
9 14
10 import com.lframework.xingyun.sc.entity.OrderDetailReport; 15 import com.lframework.xingyun.sc.entity.OrderDetailReport;
11 import io.swagger.annotations.ApiModelProperty; 16 import io.swagger.annotations.ApiModelProperty;
12 17
13 import lombok.Data; 18 import lombok.Data;
  19 +import org.apache.commons.lang3.StringUtils;
14 20
15 /** 21 /**
16 * <p> 22 * <p>
@@ -20,6 +26,10 @@ import lombok.Data; @@ -20,6 +26,10 @@ import lombok.Data;
20 */ 26 */
21 @Data 27 @Data
22 public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> { 28 public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> {
  29 + private static final String DIC_EXECUTION_STANDARD = "APPLICABLE_STANDARD";
  30 + private static final String DIC_CONTRACT_PRODUCT = "CONTRACT_PRODUCT";
  31 + private static final String DIC_SPECIAL_REQUIREMENTS = "CONDITIONS_REQUIRED";
  32 + private static final Map<String, String> DIC_NAME_CACHE = new ConcurrentHashMap<>();
23 33
24 /** 34 /**
25 * ID 35 * ID
@@ -64,6 +74,9 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> { @@ -64,6 +74,9 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> {
64 @ApiModelProperty("科办") 74 @ApiModelProperty("科办")
65 private String deptName; 75 private String deptName;
66 76
  77 + @ApiModelProperty("办事处编码")
  78 + private String deptCode;
  79 +
67 /** 80 /**
68 * 区域 81 * 区域
69 */ 82 */
@@ -290,12 +303,6 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> { @@ -290,12 +303,6 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> {
290 @ApiModelProperty("工艺要求") 303 @ApiModelProperty("工艺要求")
291 private String productionProcess; 304 private String productionProcess;
292 305
293 - @ApiModelProperty("办事处代码")  
294 - private String officeCode;  
295 -  
296 - @ApiModelProperty("办事处")  
297 - private String officeName;  
298 -  
299 @ApiModelProperty("客户简称") 306 @ApiModelProperty("客户简称")
300 private String customerShortName; 307 private String customerShortName;
301 308
@@ -305,12 +312,18 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> { @@ -305,12 +312,18 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> {
305 @ApiModelProperty("执行标准") 312 @ApiModelProperty("执行标准")
306 private String executionStandard; 313 private String executionStandard;
307 314
  315 + @ApiModelProperty("执行标准备注")
  316 + private String executionStandardRemarks;
  317 +
308 @ApiModelProperty("结构报表用(产品名称)") 318 @ApiModelProperty("结构报表用(产品名称)")
309 private String structureReportUsed; 319 private String structureReportUsed;
310 320
311 @ApiModelProperty("合同类型编码") 321 @ApiModelProperty("合同类型编码")
312 private String contractTypeCode; 322 private String contractTypeCode;
313 323
  324 + @ApiModelProperty("合同类型(经销标准、经销库存、经销未锁规、外贸标准、外贸库存、外贸未锁规、加工标准)")
  325 + private String contractTypeName;
  326 +
314 @ApiModelProperty("特别注重要求") 327 @ApiModelProperty("特别注重要求")
315 private String specialRequirements; 328 private String specialRequirements;
316 329
@@ -333,6 +346,92 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> { @@ -333,6 +346,92 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> {
333 346
334 @Override 347 @Override
335 protected void afterInit(OrderDetailReport dto) { 348 protected void afterInit(OrderDetailReport dto) {
  349 + this.executionStandard = getDicItemNameOrOriginal(DIC_EXECUTION_STANDARD, this.executionStandard);
  350 + if ("其它".equals(this.executionStandard) && StringUtils.isNotBlank(this.executionStandardRemarks)) {
  351 + this.executionStandard = this.executionStandardRemarks;
  352 + }
  353 + this.structureReportUsed = getDicItemNameOrOriginal(DIC_CONTRACT_PRODUCT, this.structureReportUsed);
  354 + this.specialRequirements = getDicItemNameOrOriginal(DIC_SPECIAL_REQUIREMENTS, this.specialRequirements);
  355 + this.deptCode = convertDeptNameToDeptCode(this.deptName);
  356 + this.contractTypeName = handleContractType(this.contractTypeCode);
  357 + }
  358 +
  359 + private static String getDicItemNameOrOriginal(String dicCode, String itemCode) {
  360 + if (StringUtils.isBlank(dicCode) || StringUtils.isBlank(itemCode)) {
  361 + return itemCode;
  362 + }
  363 + String cacheKey = dicCode + "|" + itemCode;
  364 + String cached = DIC_NAME_CACHE.get(cacheKey);
  365 + if (cached != null) {
  366 + return cached;
  367 + }
  368 + SysDataDicItemService sysDataDicItemService = ApplicationUtil.getBean(SysDataDicItemService.class);
  369 + SysDataDicItem dicItem = sysDataDicItemService.findByCode(dicCode, itemCode);
  370 + String name = dicItem == null ? itemCode : dicItem.getName();
  371 + if (StringUtils.isBlank(name)) {
  372 + name = itemCode;
  373 + }
  374 + DIC_NAME_CACHE.put(cacheKey, name);
  375 + return name;
  376 + }
  377 +
  378 + private static String convertDeptNameToDeptCode(String deptName) {
  379 + if (StringUtils.isBlank(deptName)) {
  380 + return null;
  381 + }
  382 + String name = deptName.trim();
  383 + if (name.contains("北方")) {
  384 + return "BF";
  385 + }
  386 + if (name.contains("常州")) {
  387 + return "CZ";
  388 + }
  389 + if (name.contains("东莞")) {
  390 + return "DG";
  391 + }
  392 + if (name.contains("佛山")) {
  393 + return "FS";
  394 + }
  395 + if (name.contains("宁波")) {
  396 + return "NB";
  397 + }
  398 + if (name.contains("苏州")) {
  399 + return "SZ";
  400 + }
  401 + if (name.contains("温州")) {
  402 + return "WZ";
  403 + }
  404 + if (name.contains("紫铜")) {
  405 + return "ZT";
  406 + }
  407 + if (name.contains("外贸")) {
  408 + return "WM";
  409 + }
  410 + return null;
  411 + }
336 412
  413 + private static String handleContractType(String contractType) {
  414 + if ("DISTRIB_STD".equals(contractType)) {
  415 + return "经销标准";
  416 + }
  417 + if ("DIST_STOCK_CONTRACT".equals(contractType)) {
  418 + return "经销库存";
  419 + }
  420 + if ("DRAFT_DIST_AGMT".equals(contractType)) {
  421 + return "经销未锁规";
  422 + }
  423 + if ("INTL_STD_CONTRACT".equals(contractType)) {
  424 + return "外贸标准";
  425 + }
  426 + if ("INTL_INVENTORY_AGMT".equals(contractType)) {
  427 + return "外贸库存";
  428 + }
  429 + if ("INTL_OPEN_SPEC_AGMT".equals(contractType)) {
  430 + return "外贸未锁规";
  431 + }
  432 + if ("PROCESS_STD_AGMT".equals(contractType)) {
  433 + return "加工标准";
  434 + }
  435 + return null;
337 } 436 }
338 } 437 }
@@ -65,22 +65,30 @@ public class OrderDetailReportController extends DefaultBaseController { @@ -65,22 +65,30 @@ public class OrderDetailReportController extends DefaultBaseController {
65 } 65 }
66 66
67 /** 67 /**
68 - * 库存合同未锁价订单明细查询 68 + * 库存入库订单明查询
69 */ 69 */
70 - @ApiOperation("库存合同未锁价订单明细查询")  
71 - @HasPermission({"statistical-report:order-detail:query","statistical-report:quality-order-detail:query"}) 70 + @ApiOperation("库存入库订单明查询")
  71 + @HasPermission({"statistical-report:stock-order-detail:query"})
72 @GetMapping("/inventoryUnlocked/query") 72 @GetMapping("/inventoryUnlocked/query")
73 public InvokeResult<PageResult<QueryOrderDetailReportBo>> inventoryUnlockedQuery(@Valid QueryOrderDetailReportVo vo) { 73 public InvokeResult<PageResult<QueryOrderDetailReportBo>> inventoryUnlockedQuery(@Valid QueryOrderDetailReportVo vo) {
74 vo.setInventoryUnlockedOnly(Boolean.TRUE); 74 vo.setInventoryUnlockedOnly(Boolean.TRUE);
75 vo.setExcludeInventoryUnlocked(null); 75 vo.setExcludeInventoryUnlocked(null);
76 - return query(vo); 76 + PageResult<OrderDetailReport> pageResult = orderDetailReportService.query(getPageIndex(vo), getPageSize(vo), vo);
  77 + List<OrderDetailReport> datas = pageResult.getDatas();
  78 + List<QueryOrderDetailReportBo> results = null;
  79 +
  80 + if (!CollectionUtil.isEmpty(datas)) {
  81 + results = datas.stream().map(QueryOrderDetailReportBo::new).collect(Collectors.toList());
  82 + }
  83 +
  84 + return InvokeResultBuilder.success(PageResultUtil.rebuild(pageResult, results));
77 } 85 }
78 86
79 /** 87 /**
80 - * 库存入库订单明细查询 88 + * 入库订单明细查询
81 */ 89 */
82 - @ApiOperation("库存入库订单明细查询")  
83 - @HasPermission({"statistical-report:order-detail:query","statistical-report:quality-order-detail:query"}) 90 + @ApiOperation("入库订单明细查询")
  91 + @HasPermission({"statistical-report:warehousing-order-detail:query"})
84 @GetMapping("/stockIn/query") 92 @GetMapping("/stockIn/query")
85 public InvokeResult<PageResult<QueryOrderDetailReportBo>> stockInQuery(@Valid QueryOrderDetailReportVo vo) { 93 public InvokeResult<PageResult<QueryOrderDetailReportBo>> stockInQuery(@Valid QueryOrderDetailReportVo vo) {
86 vo.setExcludeInventoryUnlocked(Boolean.TRUE); 94 vo.setExcludeInventoryUnlocked(Boolean.TRUE);
@@ -136,7 +144,7 @@ public class OrderDetailReportController extends DefaultBaseController { @@ -136,7 +144,7 @@ public class OrderDetailReportController extends DefaultBaseController {
136 * 库存入库订单明细导出 144 * 库存入库订单明细导出
137 */ 145 */
138 @ApiOperation("库存入库订单明细导出") 146 @ApiOperation("库存入库订单明细导出")
139 - @HasPermission({"statistical-report:order-detail:export"}) 147 + @HasPermission({"statistical-report:stock-order-detail:export"})
140 @PostMapping("/inventoryUnlocked/export") 148 @PostMapping("/inventoryUnlocked/export")
141 public InvokeResult<Void> inventoryUnlockedExport(@Valid @RequestBody QueryOrderDetailReportVo vo) { 149 public InvokeResult<Void> inventoryUnlockedExport(@Valid @RequestBody QueryOrderDetailReportVo vo) {
142 vo.setInventoryUnlockedOnly(Boolean.TRUE); 150 vo.setInventoryUnlockedOnly(Boolean.TRUE);
@@ -150,7 +158,7 @@ public class OrderDetailReportController extends DefaultBaseController { @@ -150,7 +158,7 @@ public class OrderDetailReportController extends DefaultBaseController {
150 * 入库订单明细导出 158 * 入库订单明细导出
151 */ 159 */
152 @ApiOperation("入库订单明细导出") 160 @ApiOperation("入库订单明细导出")
153 - @HasPermission({"statistical-report:order-detail:export"}) 161 + @HasPermission({"statistical-report:warehousing-order-detail:export"})
154 @PostMapping("/stockIn/export") 162 @PostMapping("/stockIn/export")
155 public InvokeResult<Void> stockInExport(@Valid @RequestBody QueryOrderDetailReportVo vo) { 163 public InvokeResult<Void> stockInExport(@Valid @RequestBody QueryOrderDetailReportVo vo) {
156 vo.setExcludeInventoryUnlocked(Boolean.TRUE); 164 vo.setExcludeInventoryUnlocked(Boolean.TRUE);
@@ -311,7 +311,13 @@ public class OrderDetailReport extends BaseEntity implements BaseDto { @@ -311,7 +311,13 @@ public class OrderDetailReport extends BaseEntity implements BaseDto {
311 private String executionStandard; 311 private String executionStandard;
312 312
313 /** 313 /**
314 - * 结构报表用(合同物料行产品ID) 314 + * 执行标准备注(当执行标准为“其它”时使用)
  315 + */
  316 + @TableField(exist = false)
  317 + private String executionStandardRemarks;
  318 +
  319 + /**
  320 + * 结构报表用(合同物料行产品)
315 */ 321 */
316 @TableField(exist = false) 322 @TableField(exist = false)
317 private String structureReportUsed; 323 private String structureReportUsed;
@@ -53,7 +53,7 @@ public class StockInOrderDetailReportExportTaskWorker implements @@ -53,7 +53,7 @@ public class StockInOrderDetailReportExportTaskWorker implements
53 53
54 StockInOrderDetailReportModel model = new StockInOrderDetailReportModel(); 54 StockInOrderDetailReportModel model = new StockInOrderDetailReportModel();
55 model.setOrderNo(data.getOrderNo()); 55 model.setOrderNo(data.getOrderNo());
56 - model.setDeptCode(convertDeptNameToDeptCode(data.getDeptName())); 56 + model.setDeptCode(data.getDeptCode());
57 model.setCustomerShortName(data.getCustomerShortName()); 57 model.setCustomerShortName(data.getCustomerShortName());
58 model.setOrderDate(toDate(data.getOrderDate())); 58 model.setOrderDate(toDate(data.getOrderDate()));
59 model.setWorkshopName(data.getWorkshopName()); 59 model.setWorkshopName(data.getWorkshopName());
@@ -77,7 +77,7 @@ public class StockInOrderDetailReportExportTaskWorker implements @@ -77,7 +77,7 @@ public class StockInOrderDetailReportExportTaskWorker implements
77 model.setExecutionStandard(data.getExecutionStandard()); 77 model.setExecutionStandard(data.getExecutionStandard());
78 model.setSalesPrice(toBigDecimalOrZero(data.getSalesPrice())); 78 model.setSalesPrice(toBigDecimalOrZero(data.getSalesPrice()));
79 model.setPriceListNo(data.getPriceListNo()); 79 model.setPriceListNo(data.getPriceListNo());
80 - model.setPackagingFee(toBigDecimalOrZero(data.getPackagingFee())); 80 + model.setPackagingFee(stringToBigDecimal(data.getPackagingFee()));
81 model.setSettlementTerms(data.getSettlementTerms()); 81 model.setSettlementTerms(data.getSettlementTerms());
82 model.setPieceWeightHeader(data.getPieceWeightHeader()); 82 model.setPieceWeightHeader(data.getPieceWeightHeader());
83 model.setSurface(data.getSurface()); 83 model.setSurface(data.getSurface());
@@ -87,13 +87,13 @@ public class StockInOrderDetailReportExportTaskWorker implements @@ -87,13 +87,13 @@ public class StockInOrderDetailReportExportTaskWorker implements
87 model.setSpecialRequirements(data.getSpecialRequirements()); 87 model.setSpecialRequirements(data.getSpecialRequirements());
88 model.setRemarks(data.getRemarks()); 88 model.setRemarks(data.getRemarks());
89 model.setSalesman(data.getContractCreateBy()); 89 model.setSalesman(data.getContractCreateBy());
90 - model.setShippingCost(toBigDecimalOrZero(data.getShippingCost()));  
91 - model.setReturnShippingCost(toBigDecimalOrZero(data.getReturnShippingCost())); 90 + model.setShippingCost(stringToBigDecimal(data.getShippingCost()));
  91 + model.setReturnShippingCost(stringToBigDecimal(data.getReturnShippingCost()));
92 model.setCustomerType(data.getCustomerType()); 92 model.setCustomerType(data.getCustomerType());
93 model.setQuality(data.getQuality()); 93 model.setQuality(data.getQuality());
94 model.setProcessingAndDistributor(data.getContractType()); 94 model.setProcessingAndDistributor(data.getContractType());
95 model.setActualCustomer(data.getOrderingUnitName()); 95 model.setActualCustomer(data.getOrderingUnitName());
96 - model.setOrderType(handleContractType(data.getContractTypeCode())); 96 + model.setOrderType(data.getContractTypeName());
97 model.setLeadCadmiumPpm("Pb≤ppm\n" + "Cd≤ppm"); 97 model.setLeadCadmiumPpm("Pb≤ppm\n" + "Cd≤ppm");
98 model.setIronConductivity("Fe≤ppm\n" + "Co+Ni≤ppm\n" + "%IACS"); 98 model.setIronConductivity("Fe≤ppm\n" + "Co+Ni≤ppm\n" + "%IACS");
99 model.setReserve1(data.getIndustry()); 99 model.setReserve1(data.getIndustry());
@@ -124,64 +124,21 @@ public class StockInOrderDetailReportExportTaskWorker implements @@ -124,64 +124,21 @@ public class StockInOrderDetailReportExportTaskWorker implements
124 } 124 }
125 } 125 }
126 126
127 - private static String handleContractType(String contractType) {  
128 - if ("DISTRIB_STD".equals(contractType)) {  
129 - return "经销标准";  
130 - }  
131 - if ("DIST_STOCK_CONTRACT".equals(contractType)) {  
132 - return "经销库存";  
133 - }  
134 - if ("DRAFT_DIST_AGMT".equals(contractType)) {  
135 - return "经销未锁规";  
136 - }  
137 - if ("INTL_STD_CONTRACT".equals(contractType)) {  
138 - return "外贸标准";  
139 - }  
140 - if ("INTL_INVENTORY_AGMT".equals(contractType)) {  
141 - return "外贸库存";  
142 - }  
143 - if ("INTL_OPEN_SPEC_AGMT".equals(contractType)) {  
144 - return "外贸未锁规";  
145 - }  
146 - if ("PROCESS_STD_AGMT".equals(contractType)) {  
147 - return "加工标准"; 127 + public static BigDecimal stringToBigDecimal(String str) {
  128 + // 1. 判空处理:如果为 null 或去除空格后为空字符串,直接返回 null
  129 + if (str == null || str.trim().isEmpty()) {
  130 + return null;
148 } 131 }
149 - return null;  
150 - }  
151 132
152 - private static String convertDeptNameToDeptCode(String deptName) {  
153 - if (StringUtils.isBlank(deptName)) { 133 + // 2. 尝试转换
  134 + try {
  135 + // 建议先 trim() 去除首尾空格,避免 " 100 " 这种格式报错
  136 + return new BigDecimal(str.trim());
  137 + } catch (NumberFormatException e) {
  138 + // 3. 如果字符串格式不合法(如 "abc"),根据业务需求处理,这里同样返回 null
154 return null; 139 return null;
155 } 140 }
156 - String name = deptName.trim();  
157 - if (name.contains("北方")) {  
158 - return "BF";  
159 - }  
160 - if (name.contains("常州")) {  
161 - return "CZ";  
162 - }  
163 - if (name.contains("东莞")) {  
164 - return "DG";  
165 - }  
166 - if (name.contains("佛山")) {  
167 - return "FS";  
168 - }  
169 - if (name.contains("宁波")) {  
170 - return "NB";  
171 - }  
172 - if (name.contains("苏州")) {  
173 - return "SZ";  
174 - }  
175 - if (name.contains("温州")) {  
176 - return "WZ";  
177 - }  
178 - if (name.contains("紫铜")) {  
179 - return "ZT";  
180 - }  
181 - if (name.contains("外贸")) {  
182 - return "WM";  
183 - }  
184 - return null;  
185 } 141 }
  142 +
186 } 143 }
187 144
@@ -57,6 +57,7 @@ @@ -57,6 +57,7 @@
57 <result column="customer_short_name" property="customerShortName"/> 57 <result column="customer_short_name" property="customerShortName"/>
58 <result column="settlement_terms" property="settlementTerms"/> 58 <result column="settlement_terms" property="settlementTerms"/>
59 <result column="execution_standard" property="executionStandard"/> 59 <result column="execution_standard" property="executionStandard"/>
  60 + <result column="execution_standard_remarks" property="executionStandardRemarks"/>
60 <result column="structure_report_used" property="structureReportUsed"/> 61 <result column="structure_report_used" property="structureReportUsed"/>
61 <result column="contract_type_code" property="contractTypeCode"/> 62 <result column="contract_type_code" property="contractTypeCode"/>
62 <result column="special_requirements" property="specialRequirements"/> 63 <result column="special_requirements" property="specialRequirements"/>
@@ -207,6 +208,7 @@ @@ -207,6 +208,7 @@
207 cs.short_name AS customer_short_name, 208 cs.short_name AS customer_short_name,
208 poi.settlement_terms AS settlement_terms, 209 poi.settlement_terms AS settlement_terms,
209 poi.execution_standard AS execution_standard, 210 poi.execution_standard AS execution_standard,
  211 + poi.execution_standard_remarks AS execution_standard_remarks,
210 CASE 212 CASE
211 WHEN c.type = 'PROCESS_STD_AGMT' THEN pl.product_id 213 WHEN c.type = 'PROCESS_STD_AGMT' THEN pl.product_id
212 ELSE cl.product_id 214 ELSE cl.product_id