Showing
5 changed files
with
147 additions
and
75 deletions
| ... | ... | @@ -4,13 +4,19 @@ import com.fasterxml.jackson.annotation.JsonFormat; |
| 4 | 4 | import java.math.BigDecimal; |
| 5 | 5 | import com.lframework.starter.common.constants.StringPool; |
| 6 | 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 | 10 | import java.time.LocalDate; |
| 8 | 11 | import java.time.LocalDateTime; |
| 12 | +import java.util.Map; | |
| 13 | +import java.util.concurrent.ConcurrentHashMap; | |
| 9 | 14 | |
| 10 | 15 | import com.lframework.xingyun.sc.entity.OrderDetailReport; |
| 11 | 16 | import io.swagger.annotations.ApiModelProperty; |
| 12 | 17 | |
| 13 | 18 | import lombok.Data; |
| 19 | +import org.apache.commons.lang3.StringUtils; | |
| 14 | 20 | |
| 15 | 21 | /** |
| 16 | 22 | * <p> |
| ... | ... | @@ -20,6 +26,10 @@ import lombok.Data; |
| 20 | 26 | */ |
| 21 | 27 | @Data |
| 22 | 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 | 35 | * ID |
| ... | ... | @@ -64,6 +74,9 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> { |
| 64 | 74 | @ApiModelProperty("科办") |
| 65 | 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 | 303 | @ApiModelProperty("工艺要求") |
| 291 | 304 | private String productionProcess; |
| 292 | 305 | |
| 293 | - @ApiModelProperty("办事处代码") | |
| 294 | - private String officeCode; | |
| 295 | - | |
| 296 | - @ApiModelProperty("办事处") | |
| 297 | - private String officeName; | |
| 298 | - | |
| 299 | 306 | @ApiModelProperty("客户简称") |
| 300 | 307 | private String customerShortName; |
| 301 | 308 | |
| ... | ... | @@ -305,12 +312,18 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> { |
| 305 | 312 | @ApiModelProperty("执行标准") |
| 306 | 313 | private String executionStandard; |
| 307 | 314 | |
| 315 | + @ApiModelProperty("执行标准备注") | |
| 316 | + private String executionStandardRemarks; | |
| 317 | + | |
| 308 | 318 | @ApiModelProperty("结构报表用(产品名称)") |
| 309 | 319 | private String structureReportUsed; |
| 310 | 320 | |
| 311 | 321 | @ApiModelProperty("合同类型编码") |
| 312 | 322 | private String contractTypeCode; |
| 313 | 323 | |
| 324 | + @ApiModelProperty("合同类型(经销标准、经销库存、经销未锁规、外贸标准、外贸库存、外贸未锁规、加工标准)") | |
| 325 | + private String contractTypeName; | |
| 326 | + | |
| 314 | 327 | @ApiModelProperty("特别注重要求") |
| 315 | 328 | private String specialRequirements; |
| 316 | 329 | |
| ... | ... | @@ -333,6 +346,92 @@ public class QueryOrderDetailReportBo extends BaseBo<OrderDetailReport> { |
| 333 | 346 | |
| 334 | 347 | @Override |
| 335 | 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 | 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 | 72 | @GetMapping("/inventoryUnlocked/query") |
| 73 | 73 | public InvokeResult<PageResult<QueryOrderDetailReportBo>> inventoryUnlockedQuery(@Valid QueryOrderDetailReportVo vo) { |
| 74 | 74 | vo.setInventoryUnlockedOnly(Boolean.TRUE); |
| 75 | 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 | 92 | @GetMapping("/stockIn/query") |
| 85 | 93 | public InvokeResult<PageResult<QueryOrderDetailReportBo>> stockInQuery(@Valid QueryOrderDetailReportVo vo) { |
| 86 | 94 | vo.setExcludeInventoryUnlocked(Boolean.TRUE); |
| ... | ... | @@ -136,7 +144,7 @@ public class OrderDetailReportController extends DefaultBaseController { |
| 136 | 144 | * 库存入库订单明细导出 |
| 137 | 145 | */ |
| 138 | 146 | @ApiOperation("库存入库订单明细导出") |
| 139 | - @HasPermission({"statistical-report:order-detail:export"}) | |
| 147 | + @HasPermission({"statistical-report:stock-order-detail:export"}) | |
| 140 | 148 | @PostMapping("/inventoryUnlocked/export") |
| 141 | 149 | public InvokeResult<Void> inventoryUnlockedExport(@Valid @RequestBody QueryOrderDetailReportVo vo) { |
| 142 | 150 | vo.setInventoryUnlockedOnly(Boolean.TRUE); |
| ... | ... | @@ -150,7 +158,7 @@ public class OrderDetailReportController extends DefaultBaseController { |
| 150 | 158 | * 入库订单明细导出 |
| 151 | 159 | */ |
| 152 | 160 | @ApiOperation("入库订单明细导出") |
| 153 | - @HasPermission({"statistical-report:order-detail:export"}) | |
| 161 | + @HasPermission({"statistical-report:warehousing-order-detail:export"}) | |
| 154 | 162 | @PostMapping("/stockIn/export") |
| 155 | 163 | public InvokeResult<Void> stockInExport(@Valid @RequestBody QueryOrderDetailReportVo vo) { |
| 156 | 164 | vo.setExcludeInventoryUnlocked(Boolean.TRUE); | ... | ... |
| ... | ... | @@ -311,7 +311,13 @@ public class OrderDetailReport extends BaseEntity implements BaseDto { |
| 311 | 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 | 322 | @TableField(exist = false) |
| 317 | 323 | private String structureReportUsed; | ... | ... |
| ... | ... | @@ -53,7 +53,7 @@ public class StockInOrderDetailReportExportTaskWorker implements |
| 53 | 53 | |
| 54 | 54 | StockInOrderDetailReportModel model = new StockInOrderDetailReportModel(); |
| 55 | 55 | model.setOrderNo(data.getOrderNo()); |
| 56 | - model.setDeptCode(convertDeptNameToDeptCode(data.getDeptName())); | |
| 56 | + model.setDeptCode(data.getDeptCode()); | |
| 57 | 57 | model.setCustomerShortName(data.getCustomerShortName()); |
| 58 | 58 | model.setOrderDate(toDate(data.getOrderDate())); |
| 59 | 59 | model.setWorkshopName(data.getWorkshopName()); |
| ... | ... | @@ -77,7 +77,7 @@ public class StockInOrderDetailReportExportTaskWorker implements |
| 77 | 77 | model.setExecutionStandard(data.getExecutionStandard()); |
| 78 | 78 | model.setSalesPrice(toBigDecimalOrZero(data.getSalesPrice())); |
| 79 | 79 | model.setPriceListNo(data.getPriceListNo()); |
| 80 | - model.setPackagingFee(toBigDecimalOrZero(data.getPackagingFee())); | |
| 80 | + model.setPackagingFee(stringToBigDecimal(data.getPackagingFee())); | |
| 81 | 81 | model.setSettlementTerms(data.getSettlementTerms()); |
| 82 | 82 | model.setPieceWeightHeader(data.getPieceWeightHeader()); |
| 83 | 83 | model.setSurface(data.getSurface()); |
| ... | ... | @@ -87,13 +87,13 @@ public class StockInOrderDetailReportExportTaskWorker implements |
| 87 | 87 | model.setSpecialRequirements(data.getSpecialRequirements()); |
| 88 | 88 | model.setRemarks(data.getRemarks()); |
| 89 | 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 | 92 | model.setCustomerType(data.getCustomerType()); |
| 93 | 93 | model.setQuality(data.getQuality()); |
| 94 | 94 | model.setProcessingAndDistributor(data.getContractType()); |
| 95 | 95 | model.setActualCustomer(data.getOrderingUnitName()); |
| 96 | - model.setOrderType(handleContractType(data.getContractTypeCode())); | |
| 96 | + model.setOrderType(data.getContractTypeName()); | |
| 97 | 97 | model.setLeadCadmiumPpm("Pb≤ppm\n" + "Cd≤ppm"); |
| 98 | 98 | model.setIronConductivity("Fe≤ppm\n" + "Co+Ni≤ppm\n" + "%IACS"); |
| 99 | 99 | model.setReserve1(data.getIndustry()); |
| ... | ... | @@ -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 | 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 | 57 | <result column="customer_short_name" property="customerShortName"/> |
| 58 | 58 | <result column="settlement_terms" property="settlementTerms"/> |
| 59 | 59 | <result column="execution_standard" property="executionStandard"/> |
| 60 | + <result column="execution_standard_remarks" property="executionStandardRemarks"/> | |
| 60 | 61 | <result column="structure_report_used" property="structureReportUsed"/> |
| 61 | 62 | <result column="contract_type_code" property="contractTypeCode"/> |
| 62 | 63 | <result column="special_requirements" property="specialRequirements"/> |
| ... | ... | @@ -207,6 +208,7 @@ |
| 207 | 208 | cs.short_name AS customer_short_name, |
| 208 | 209 | poi.settlement_terms AS settlement_terms, |
| 209 | 210 | poi.execution_standard AS execution_standard, |
| 211 | + poi.execution_standard_remarks AS execution_standard_remarks, | |
| 210 | 212 | CASE |
| 211 | 213 | WHEN c.type = 'PROCESS_STD_AGMT' THEN pl.product_id |
| 212 | 214 | ELSE cl.product_id | ... | ... |