Commit e1317557947bbe20bf74e48424a82dc3db75fc36

Authored by 房远帅
2 parents 8eb99423 851d90a8

Merge branch 'master_after0506' into mater_procurement

Showing 32 changed files with 463 additions and 118 deletions
... ... @@ -409,7 +409,7 @@ CREATE TABLE IF NOT EXISTS `tbl_purchase_order_revoke_line`
409 409 `length_tol_neg` decimal(10, 4) DEFAULT NULL COMMENT '长度公差负',
410 410 `status` varchar(50) DEFAULT NULL COMMENT '状态',
411 411 `quantity` decimal(15, 4) NOT NULL COMMENT '原数量kg',
412   - `sales_price` decimal(15, 4) NOT NULL COMMENT '销售价格',
  412 + `sales_price` decimal(15, 4) DEFAULT NULL COMMENT '销售价格',
413 413 `delivery_date` date DEFAULT NULL COMMENT '发货日期',
414 414 `revoke_quantity` decimal(15, 4) DEFAULT NULL COMMENT '撤销数量',
415 415 `show_order` int DEFAULT '0' COMMENT '排序',
... ...
... ... @@ -145,6 +145,12 @@ public class GetPurchaseOrderRevokeBo extends BaseBo<PurchaseOrderRevoke> {
145 145 @ApiModelProperty("订货单撤销表物料行")
146 146 private List<PurchaseOrderRevokeLine> purchaseOrderRevokeLineList;
147 147
  148 + /**
  149 + * 合同类型
  150 + */
  151 + @ApiModelProperty("合同类型")
  152 + private String contractType;
  153 +
148 154 public GetPurchaseOrderRevokeBo() {
149 155
150 156 }
... ...
... ... @@ -260,6 +260,12 @@ public class OrderChangeRecordBo extends BaseBo<OrderInfoChangeRecord> {
260 260 @ApiModelProperty("是否是变更发起人")
261 261 private Boolean changeCreateBy;
262 262
  263 + /**
  264 + * 合同类型
  265 + */
  266 + @ApiModelProperty("合同类型")
  267 + private String contractType;
  268 +
263 269
264 270 public OrderChangeRecordBo() {
265 271
... ...
... ... @@ -152,6 +152,12 @@ public class GetReplenishmentOrderBo extends BaseBo<ReplenishmentOrder> {
152 152 @ApiModelProperty("补货单物料行")
153 153 private List<GetReplenishmentOrderLineBo> replenishmentOrderLineList;
154 154
  155 + /**
  156 + * 合同类型
  157 + */
  158 + @ApiModelProperty("合同类型")
  159 + private String contractType;
  160 +
155 161 public GetReplenishmentOrderBo() {
156 162
157 163 }
... ...
... ... @@ -523,7 +523,7 @@ public class ContractDistributorStandardController extends DefaultBaseController
523 523 SysUser sysUser = sysUserService.findById(currentUserId);
524 524 String officeCode = resolveOfficeCodeByUser(sysUser);
525 525 if (StringUtils.isBlank(officeCode)) {
526   - throw new DefaultClientException("当前用不属于九大办事处,无法生成合同编号!");
  526 + throw new DefaultClientException("当前用户不属于办事处,无法生成合同编号!");
527 527 }
528 528
529 529 String monthCode = LocalDate.now().format(DateTimeFormatter.ofPattern("yyMM"));
... ...
... ... @@ -5,9 +5,13 @@ import com.lframework.starter.web.core.annotations.security.HasPermission;
5 5 import com.lframework.starter.web.core.controller.DefaultBaseController;
6 6 import com.lframework.starter.web.core.utils.JsonUtil;
7 7 import com.lframework.xingyun.sc.bo.order.change.OrderChangeRecordBo;
  8 +import com.lframework.xingyun.sc.entity.ContractDistributorStandard;
8 9 import com.lframework.xingyun.sc.entity.OrderInfoChangeRecord;
  10 +import com.lframework.xingyun.sc.entity.PurchaseOrderInfo;
9 11 import com.lframework.xingyun.sc.entity.PurchaseOrderLine;
10 12 import com.lframework.xingyun.sc.enums.OrderSpecChangeStatus;
  13 +import com.lframework.xingyun.sc.service.contract.ContractDistributorStandardService;
  14 +import com.lframework.xingyun.sc.service.order.PurchaseOrderInfoService;
11 15 import com.lframework.xingyun.sc.utils.ExcelUtil;
12 16 import com.lframework.xingyun.sc.utils.LatexFormulaExcelExporterUtil;
13 17 import com.lframework.xingyun.sc.utils.ResponseUtil;
... ... @@ -60,6 +64,10 @@ public class OrderChangeRecordController extends DefaultBaseController {
60 64
61 65 @Resource
62 66 private OrderChangeRecordService orderChangeRecordService;
  67 + @Resource
  68 + private PurchaseOrderInfoService purchaseOrderInfoService;
  69 + @Resource
  70 + private ContractDistributorStandardService contractDistributorStandardService;
63 71
64 72 /**
65 73 * 查询列表
... ... @@ -90,6 +98,16 @@ public class OrderChangeRecordController extends DefaultBaseController {
90 98 throw new DefaultClientException("订货单变更记录不存在!");
91 99 }
92 100 OrderChangeRecordBo result = new OrderChangeRecordBo(data);
  101 + PurchaseOrderInfo purchaseOrderInfo = purchaseOrderInfoService.findById(result.getOrderId());
  102 + if (purchaseOrderInfo != null) {
  103 + String contractId = purchaseOrderInfo.getContractId();
  104 + if (StringUtils.isNotEmpty(contractId)) {
  105 + ContractDistributorStandard contractDistributorStandard = contractDistributorStandardService.findById(contractId);
  106 + if (contractDistributorStandard != null) {
  107 + result.setContractType(contractDistributorStandard.getType());
  108 + }
  109 + }
  110 + }
93 111
94 112 return InvokeResultBuilder.success(result);
95 113 }
... ... @@ -182,20 +200,12 @@ public class OrderChangeRecordController extends DefaultBaseController {
182 200
183 201 // 过滤需要显示的变更前记录(DELETE 或 UPDATE 且有变化)
184 202 List<PurchaseOrderLine> beforeLines = beforeChangeSpecList.stream()
185   - .filter(line -> "DELETE".equals(line.getType()) ||
186   - ("UPDATE".equals(line.getType()) &&
187   - (line.getBrandChange() || line.getLengthChange() || line.getWidthChange() ||
188   - line.getThicknessChange() || line.getStatusChange() ||
189   - line.getQuantityChange() || line.getSalesPriceChange())))
  203 + .filter(this::shouldPrintChangeLine)
190 204 .collect(Collectors.toList());
191 205
192 206 // 过滤需要显示的变更后记录(ADD 或 UPDATE 且有变化)
193 207 List<PurchaseOrderLine> afterLines = afterChangeSpecList.stream()
194   - .filter(line -> "ADD".equals(line.getType()) ||
195   - ("UPDATE".equals(line.getType()) &&
196   - (line.getBrandChange() || line.getLengthChange() || line.getWidthChange() ||
197   - line.getThicknessChange() || line.getStatusChange() ||
198   - line.getQuantityChange() || line.getSalesPriceChange())))
  208 + .filter(this::shouldPrintChangeLine)
199 209 .collect(Collectors.toList());
200 210
201 211 // ========== 填充变更前区域(起始行:5)==========
... ... @@ -209,44 +219,7 @@ public class OrderChangeRecordController extends DefaultBaseController {
209 219 PurchaseOrderLine line = i < beforeLines.size() ? beforeLines.get(i) : null;
210 220 int rowIdx = beforeStartRow + i;
211 221 if (line != null) {
212   - ExcelUtil.setCellValue(sheet, rowIdx, 0, line.getIndustry());
213   - ExcelUtil.setCellValue(sheet, rowIdx, 1, line.getQuality());
214   - ExcelUtil.setCellValue(sheet, rowIdx, 2, line.getBrand());
215   - List<LatexFormulaExcelExporterUtil.FormulaComponent> formulaComponentList = new ArrayList<>(3);
216   - if (line.getThickness() != null) {
217   - LatexFormulaExcelExporterUtil.FormulaComponent formulaComponent = new LatexFormulaExcelExporterUtil.FormulaComponent();
218   - formulaComponent.setBase(line.getThickness());
219   - formulaComponent.setSup(line.getThicknessTolPos());
220   - formulaComponent.setSub(line.getThicknessTolNeg());
221   - formulaComponentList.add(formulaComponent);
222   - }
223   -
224   - if (line.getWidth() != null) {
225   - LatexFormulaExcelExporterUtil.FormulaComponent formulaComponent = new LatexFormulaExcelExporterUtil.FormulaComponent();
226   - formulaComponent.setBase(line.getWidth());
227   - formulaComponent.setSup(line.getWidthTolPos());
228   - formulaComponent.setSub(line.getWidthTolNeg());
229   - formulaComponentList.add(formulaComponent);
230   - }
231   -
232   - if (line.getLength() != null) {
233   - LatexFormulaExcelExporterUtil.FormulaComponent formulaComponent = new LatexFormulaExcelExporterUtil.FormulaComponent();
234   - formulaComponent.setBase(line.getLength());
235   - formulaComponent.setSup(line.getLengthTolPos());
236   - formulaComponent.setSub(line.getLengthTolNeg());
237   - formulaComponentList.add(formulaComponent);
238   - }
239   -
240   - String latex = LatexFormulaExcelExporterUtil.convertToLatex(formulaComponentList);
241   - if (StringUtils.isNotBlank(latex)) {
242   - LatexFormulaExcelExporterUtil.insertLatexImageToCell(workbook, sheet, latex, rowIdx, 3, 1, 1);
243   - }
244   - ExcelUtil.setCellValue(sheet, rowIdx, 4, line.getStatus());
245   - ExcelUtil.setCellValue(sheet, rowIdx, 5, line.getQuantity());
246   - ExcelUtil.setCellValue(sheet, rowIdx, 6, line.getSalesPrice());
247   - ExcelUtil.setCellValue(sheet, rowIdx, 7,
248   - line.getDeliveryDate() == null ? "" : line.getDeliveryDate().format(dateFormatter));
249   - ExcelUtil.setCellValue(sheet, rowIdx, 8, line.getAssessmentExceedsAgreement());
  222 + fillChangePrintRow(workbook, sheet, rowIdx, line, dateFormatter);
250 223 } else {
251 224 for (int col = 0; col <= 8; col++) {
252 225 ExcelUtil.setCellValue(sheet, rowIdx, col, "");
... ... @@ -264,44 +237,7 @@ public class OrderChangeRecordController extends DefaultBaseController {
264 237 PurchaseOrderLine line = i < afterLines.size() ? afterLines.get(i) : null;
265 238 int rowIdx = afterStartRow + i;
266 239 if (line != null) {
267   - ExcelUtil.setCellValue(sheet, rowIdx, 0, line.getIndustry());
268   - ExcelUtil.setCellValue(sheet, rowIdx, 1, line.getQuality());
269   - ExcelUtil.setCellValue(sheet, rowIdx, 2, line.getBrand());
270   - List<LatexFormulaExcelExporterUtil.FormulaComponent> formulaComponentList = new ArrayList<>(3);
271   - if (line.getThickness() != null) {
272   - LatexFormulaExcelExporterUtil.FormulaComponent formulaComponent = new LatexFormulaExcelExporterUtil.FormulaComponent();
273   - formulaComponent.setBase(line.getThickness());
274   - formulaComponent.setSup(line.getThicknessTolPos());
275   - formulaComponent.setSub(line.getThicknessTolNeg());
276   - formulaComponentList.add(formulaComponent);
277   - }
278   -
279   - if (line.getWidth() != null) {
280   - LatexFormulaExcelExporterUtil.FormulaComponent formulaComponent = new LatexFormulaExcelExporterUtil.FormulaComponent();
281   - formulaComponent.setBase(line.getWidth());
282   - formulaComponent.setSup(line.getWidthTolPos());
283   - formulaComponent.setSub(line.getWidthTolNeg());
284   - formulaComponentList.add(formulaComponent);
285   - }
286   -
287   - if (line.getLength() != null) {
288   - LatexFormulaExcelExporterUtil.FormulaComponent formulaComponent = new LatexFormulaExcelExporterUtil.FormulaComponent();
289   - formulaComponent.setBase(line.getLength());
290   - formulaComponent.setSup(line.getLengthTolPos());
291   - formulaComponent.setSub(line.getLengthTolNeg());
292   - formulaComponentList.add(formulaComponent);
293   - }
294   -
295   - String latex = LatexFormulaExcelExporterUtil.convertToLatex(formulaComponentList);
296   - if (StringUtils.isNotBlank(latex)) {
297   - LatexFormulaExcelExporterUtil.insertLatexImageToCell(workbook, sheet, latex, rowIdx, 3, 1, 1);
298   - }
299   - ExcelUtil.setCellValue(sheet, rowIdx, 4, line.getStatus());
300   - ExcelUtil.setCellValue(sheet, rowIdx, 5, line.getQuantity());
301   - ExcelUtil.setCellValue(sheet, rowIdx, 6, line.getSalesPrice());
302   - ExcelUtil.setCellValue(sheet, rowIdx, 7,
303   - line.getDeliveryDate() == null ? "" : line.getDeliveryDate().format(dateFormatter));
304   - ExcelUtil.setCellValue(sheet, rowIdx, 8, line.getAssessmentExceedsAgreement());
  240 + fillChangePrintRow(workbook, sheet, rowIdx, line, dateFormatter);
305 241 } else {
306 242 for (int col = 0; col <= 8; col++) {
307 243 ExcelUtil.setCellValue(sheet, rowIdx, col, "");
... ... @@ -492,4 +428,96 @@ public class OrderChangeRecordController extends DefaultBaseController {
492 428 target.setAssessmentExceedsAgreementChange(!Objects.equals(before.getAssessmentExceedsAgreement(), after.getAssessmentExceedsAgreement()));
493 429 }
494 430
  431 + /**
  432 + * 判断当前记录是否需要在规格变更打印中展示。
  433 + *
  434 + * @param line 订货单明细
  435 + * @return true:需要打印;false:不需要打印
  436 + */
  437 + private boolean shouldPrintChangeLine(PurchaseOrderLine line) {
  438 + if (line == null) {
  439 + return false;
  440 + }
  441 + if ("DELETE".equals(line.getType()) || "ADD".equals(line.getType())) {
  442 + return true;
  443 + }
  444 + return "UPDATE".equals(line.getType()) && (line.getBrandChange()
  445 + || line.getLengthChange()
  446 + || line.getWidthChange()
  447 + || line.getThicknessChange()
  448 + || line.getStatusChange()
  449 + || line.getQuantityChange()
  450 + || line.getSalesPriceChange()
  451 + || line.getDeliveryDateChange()
  452 + || line.getAssessmentExceedsAgreementChange());
  453 + }
  454 +
  455 + /**
  456 + * 填充规格变更单打印行数据,并按订货单一致的方式渲染规格。
  457 + *
  458 + * @param workbook 工作簿
  459 + * @param sheet 工作表
  460 + * @param rowIdx 行号
  461 + * @param line 订货单明细
  462 + * @param dateFormatter 日期格式化器
  463 + * @throws IOException 规格渲染异常
  464 + */
  465 + private void fillChangePrintRow(Workbook workbook, Sheet sheet, int rowIdx, PurchaseOrderLine line,
  466 + DateTimeFormatter dateFormatter) throws IOException {
  467 + ExcelUtil.setCellValue(sheet, rowIdx, 0, line.getIndustry());
  468 + ExcelUtil.setCellValue(sheet, rowIdx, 1, line.getQuality());
  469 + ExcelUtil.setCellValue(sheet, rowIdx, 2, line.getBrand());
  470 + renderSpecForChangePrint(workbook, sheet, rowIdx, line);
  471 + ExcelUtil.setCellValue(sheet, rowIdx, 4, line.getStatus());
  472 + ExcelUtil.setCellValue(sheet, rowIdx, 5, line.getQuantity());
  473 + ExcelUtil.setCellValue(sheet, rowIdx, 6, line.getSalesPrice());
  474 + ExcelUtil.setCellValue(sheet, rowIdx, 7,
  475 + line.getDeliveryDate() == null ? "" : line.getDeliveryDate().format(dateFormatter));
  476 + ExcelUtil.setCellValue(sheet, rowIdx, 8, line.getAssessmentExceedsAgreement());
  477 + }
  478 +
  479 + /**
  480 + * 按订货单打印规则渲染规格,避免规格图片过大并保持左对齐。
  481 + *
  482 + * @param workbook 工作簿
  483 + * @param sheet 工作表
  484 + * @param rowIdx 行号
  485 + * @param line 订货单明细
  486 + * @throws IOException 规格渲染异常
  487 + */
  488 + private void renderSpecForChangePrint(Workbook workbook, Sheet sheet, int rowIdx, PurchaseOrderLine line)
  489 + throws IOException {
  490 + List<LatexFormulaExcelExporterUtil.FormulaComponent> formulaComponentList = new ArrayList<>(3);
  491 + if (line.getThickness() != null) {
  492 + LatexFormulaExcelExporterUtil.FormulaComponent formulaComponent = new LatexFormulaExcelExporterUtil.FormulaComponent();
  493 + formulaComponent.setBase(line.getThickness());
  494 + formulaComponent.setSup(line.getThicknessTolPos());
  495 + formulaComponent.setSub(line.getThicknessTolNeg());
  496 + formulaComponentList.add(formulaComponent);
  497 + }
  498 +
  499 + if (line.getWidth() != null) {
  500 + LatexFormulaExcelExporterUtil.FormulaComponent formulaComponent = new LatexFormulaExcelExporterUtil.FormulaComponent();
  501 + formulaComponent.setBase(line.getWidth());
  502 + formulaComponent.setSup(line.getWidthTolPos());
  503 + formulaComponent.setSub(line.getWidthTolNeg());
  504 + formulaComponentList.add(formulaComponent);
  505 + }
  506 +
  507 + if (line.getLength() != null) {
  508 + LatexFormulaExcelExporterUtil.FormulaComponent formulaComponent = new LatexFormulaExcelExporterUtil.FormulaComponent();
  509 + formulaComponent.setBase(line.getLength());
  510 + formulaComponent.setSup(line.getLengthTolPos());
  511 + formulaComponent.setSub(line.getLengthTolNeg());
  512 + formulaComponentList.add(formulaComponent);
  513 + }
  514 +
  515 + String latex = LatexFormulaExcelExporterUtil.convertToContractSpecLatexSingleLineFixed3(formulaComponentList);
  516 + if (StringUtils.isNotBlank(latex)) {
  517 + LatexFormulaExcelExporterUtil.insertLatexImageToCellLeftAligned(workbook, sheet, latex, rowIdx, 3, 1, 1);
  518 + } else {
  519 + ExcelUtil.setCellValue(sheet, rowIdx, 3, "");
  520 + }
  521 + }
  522 +
495 523 }
... ...
... ... @@ -419,7 +419,7 @@ public class PurchaseOrderInfoController extends DefaultBaseController {
419 419
420 420 String latex = LatexFormulaExcelExporterUtil.convertToContractSpecLatexSingleLineFixed3(formulaComponentList);
421 421 if (StringUtils.isNotBlank(latex)) {
422   - LatexFormulaExcelExporterUtil.insertLatexImageToCell(workbook, sheet, latex, startRow, 4, 1, 7);
  422 + LatexFormulaExcelExporterUtil.insertLatexImageToCellLeftAligned(workbook, sheet, latex, startRow, 4, 1, 7);
423 423 }
424 424
425 425 setCellValue(sheet, startRow, 11, currentOrderLine.getStatus());
... ... @@ -459,6 +459,7 @@ public class PurchaseOrderInfoController extends DefaultBaseController {
459 459 dataMap.put("performanceance", data.getPerformance());
460 460 dataMap.put("packaging", data.getPackaging());
461 461 dataMap.put("shippingCost", data.getShippingCost());
  462 + dataMap.put("destination", ExcelUtil.buildPrintDestination(data.getContractType(), data.getDestination(), data.getForeignDestination()));
462 463 dataMap.put("remarks", data.getRemarks());
463 464 dataMap.put("createUser", data.getCreateBy());
464 465 dataMap.put("element", data.getElement());
... ... @@ -491,6 +492,7 @@ public class PurchaseOrderInfoController extends DefaultBaseController {
491 492
492 493 if ("PDF".equals(exportType)) {
493 494 ExcelUtil.adjustVerticalTitleForPdf(workbook, sheet, "具体质量要求", true);
  495 + ExcelUtil.adjustVerticalTitleForPdf(workbook, sheet, "备注", true);
494 496 ExcelUtil.adjustVerticalTitleForPdf(workbook, sheet, "生产工艺", false);
495 497 ResponseUtil.setPDFResponseHead(response, data.getOrderNo() + "-"
496 498 + data.getOrderingUnitName() + "-" + data.getWorkshopName() + "-订货单打印.pdf");
... ...
... ... @@ -16,6 +16,7 @@ import javax.validation.constraints.NotBlank;
16 16 import com.lframework.xingyun.sc.bo.order.GetPurchaseOrderInfoBo;
17 17 import com.lframework.xingyun.sc.bo.order.GetPurchaseOrderRevokeBo;
18 18 import com.lframework.xingyun.sc.entity.*;
  19 +import com.lframework.xingyun.sc.service.contract.ContractDistributorStandardService;
19 20 import com.lframework.xingyun.sc.service.order.PurchaseOrderInfoService;
20 21 import com.lframework.xingyun.sc.service.order.PurchaseOrderLineService;
21 22 import com.lframework.xingyun.sc.service.order.PurchaseOrderRevokeLineService;
... ... @@ -28,6 +29,7 @@ import io.swagger.annotations.ApiOperation;
28 29 import com.lframework.starter.common.utils.CollectionUtil;
29 30 import io.swagger.annotations.Api;
30 31 import org.apache.commons.collections.CollectionUtils;
  32 +import org.apache.commons.lang3.StringUtils;
31 33 import org.springframework.web.bind.annotation.DeleteMapping;
32 34 import org.springframework.beans.factory.annotation.Autowired;
33 35 import org.springframework.validation.annotation.Validated;
... ... @@ -58,6 +60,8 @@ public class PurchaseOrderRevokeController extends DefaultBaseController {
58 60 private PurchaseOrderRevokeLineService purchaseOrderRevokeLineService;
59 61 @Resource
60 62 private FlowTaskWrapperMapper flowTaskWrapperMapper;
  63 + @Resource
  64 + private ContractDistributorStandardService contractDistributorStandardService;
61 65
62 66 /**
63 67 * 查询列表
... ... @@ -124,6 +128,16 @@ public class PurchaseOrderRevokeController extends DefaultBaseController {
124 128 if (CollectionUtil.isNotEmpty(query)) {
125 129 result.setPurchaseOrderRevokeLineList(query);
126 130 }
  131 + PurchaseOrderInfo purchaseOrderInfo = purchaseOrderInfoService.findById(data.getPurchaseOrderId());
  132 + if (purchaseOrderInfo != null) {
  133 + String contractId = purchaseOrderInfo.getContractId();
  134 + if (StringUtils.isNotEmpty(contractId)) {
  135 + ContractDistributorStandard contractDistributorStandard = contractDistributorStandardService.findById(contractId);
  136 + if (contractDistributorStandard != null) {
  137 + result.setContractType(contractDistributorStandard.getType());
  138 + }
  139 + }
  140 + }
127 141
128 142 return InvokeResultBuilder.success(result);
129 143 }
... ...
... ... @@ -293,7 +293,7 @@ public class ProductSampleConfirmationSlipController extends DefaultBaseControll
293 293 dataMap.put("workshopName", result.getWorkshopName() == null ? "" : result.getWorkshopName());
294 294 dataMap.put("belongingBreed", result.getBelongingBreed() == null ? "" : result.getBelongingBreed());
295 295 dataMap.put("originalSupplierPeer", result.getOriginalSupplierPeer() == null ? "" : result.getOriginalSupplierPeer());
296   - dataMap.put("totalQuantity", result.getTotalQuantity() == null ? "" : result.getTotalQuantity().stripTrailingZeros());
  296 + dataMap.put("totalQuantity", result.getTotalQuantity() == null ? "" : result.getTotalQuantity());
297 297 dataMap.put("sampleQuantityRegulation", result.isSampleQuantityRegulation() ? "是" : "否");
298 298 dataMap.put("specificationQuantityRegulation", result.isSpecificationQuantityRegulation() ? "是" : "否");
299 299 dataMap.put("sampleFrequency", result.getSampleFrequency() == null ? "" : result.getSampleFrequency());
... ...
... ... @@ -26,9 +26,11 @@ import com.lframework.xingyun.basedata.vo.customer.QueryCustomerVo;
26 26 import com.lframework.xingyun.sc.bo.purchase.GetReplenishmentOrderBo;
27 27 import com.lframework.xingyun.sc.bo.purchase.GetReplenishmentOrderLineBo;
28 28 import com.lframework.xingyun.sc.bo.purchase.QueryReplenishmentOrderBo;
  29 +import com.lframework.xingyun.sc.entity.ContractDistributorStandard;
29 30 import com.lframework.xingyun.sc.entity.PurchaseOrderInfo;
30 31 import com.lframework.xingyun.sc.entity.ReplenishmentOrder;
31 32 import com.lframework.xingyun.sc.entity.ReplenishmentOrderLine;
  33 +import com.lframework.xingyun.sc.service.contract.ContractDistributorStandardService;
32 34 import com.lframework.xingyun.sc.service.order.PurchaseOrderInfoService;
33 35 import com.lframework.xingyun.sc.service.purchase.ReplenishmentOrderLineService;
34 36 import com.lframework.xingyun.sc.service.purchase.ReplenishmentOrderService;
... ... @@ -77,6 +79,8 @@ public class ReplenishmentOrderController extends DefaultBaseController {
77 79 private ReplenishmentOrderLineService replenishmentOrderLineService;
78 80 @Resource
79 81 private FlowTaskWrapperMapper flowTaskWrapperMapper;
  82 + @Resource
  83 + private ContractDistributorStandardService contractDistributorStandardService;
80 84
81 85
82 86 public static final String AUDIT_STATUS_DIC_CODE = "AUDIT_STATUS"; // 审核状态
... ... @@ -195,6 +199,13 @@ public class ReplenishmentOrderController extends DefaultBaseController {
195 199 result.setStatusName(sysDataDicItem == null ? "" : sysDataDicItem.getName());
196 200 PurchaseOrderInfo purchaseOrderInfo = purchaseOrderInfoService.findById(data.getPurchaseOrderId());
197 201 result.setPurchaseOrderName(purchaseOrderInfo == null ? "" : purchaseOrderInfo.getOrderNo());
  202 + String contractId = purchaseOrderInfo.getContractId();
  203 + if (StringUtils.isNotEmpty(contractId)) {
  204 + ContractDistributorStandard contractDistributorStandard = contractDistributorStandardService.findById(contractId);
  205 + if (contractDistributorStandard != null) {
  206 + result.setContractType(contractDistributorStandard.getType());
  207 + }
  208 + }
198 209
199 210 Wrapper<ReplenishmentOrderLine> lineWrapper = Wrappers.lambdaQuery(ReplenishmentOrderLine.class)
200 211 .eq(ReplenishmentOrderLine::getReplenishmentOrderId, id)
... ...
... ... @@ -293,7 +293,7 @@ public class ShipmentsOrderInfoController extends DefaultBaseController {
293 293 // 加载模板文件
294 294 String templatePath = "templates/shipmentsOrderTemplate_02.xlsx";
295 295 if ("TYPE_1".equals(vo.getType())) {
296   - templatePath = "templates/shipmentsOrderTemplate_01.xlsx";
  296 + templatePath = "templates/shipmentsOrderTemplate_03.xlsx";
297 297 }
298 298 // 创建临时目录
299 299 Path tempDir = null;
... ...
... ... @@ -258,6 +258,7 @@ public class BusinessDataExportHandler implements ExportHandler {
258 258 dataMap.put("performanceance", orderInfo.getPerformance());
259 259 dataMap.put("packaging", orderInfo.getPackaging());
260 260 dataMap.put("shippingCost", orderInfo.getShippingCost());
  261 + dataMap.put("destination", ExcelUtil.buildPrintDestination(orderInfo.getContractType(), orderInfo.getDestination(), orderInfo.getForeignDestination()));
261 262 dataMap.put("remarks", orderInfo.getRemarks());
262 263 dataMap.put("createUser", orderInfo.getCreateBy());
263 264 dataMap.put("element", orderInfo.getElement());
... ... @@ -281,6 +282,7 @@ public class BusinessDataExportHandler implements ExportHandler {
281 282 String createTime = orderInfo.getCreateTime().format(dateTimeFormatter);
282 283 if ("PDF".equals(queryVo.getExportFileType())) {
283 284 ExcelUtil.adjustVerticalTitleForPdf(workbook, sheet, "具体质量要求", true);
  285 + ExcelUtil.adjustVerticalTitleForPdf(workbook, sheet, "备注", true);
284 286 ExcelUtil.adjustVerticalTitleForPdf(workbook, sheet, "生产工艺", false);
285 287 // 输出PDF
286 288 File tempExcel = File.createTempFile("purchase_order_" + orderInfo.getOrderNo(), ".xlsx");
... ...
... ... @@ -1455,6 +1455,7 @@ public class ContractDistributorStandardServiceImpl extends
1455 1455 data.setPerformance(vo.getPerformance());
1456 1456 data.setComponent(vo.getComponent());
1457 1457 data.setPackaging(vo.getPackaging());
  1458 + data.setRemarks(vo.getRemarks());
1458 1459 // data.setStandardizedAt(LocalDateTime.now());
1459 1460 getBaseMapper().insert(data);
1460 1461
... ...
... ... @@ -231,7 +231,7 @@ public class FlowTaskServiceImpl implements FlowTaskService {
231 231 if ("SZ".equals(deptCode) || "CZ".equals(deptCode) || "BF".equals(deptCode)) {
232 232 //苏州常州北方办事处
233 233 roleCode = "szczbfbscfg";
234   - } else if ("GD".equals(deptCode) || "FS".equals(deptCode)) {
  234 + } else if ("DG".equals(deptCode) || "FS".equals(deptCode)) {
235 235 //东莞佛山办事处
236 236 roleCode = "dgfsbscfg";
237 237 } else if ("NB".equals(deptCode) || "WZ".equals(deptCode)) {
... ...
... ... @@ -36,6 +36,7 @@ import com.lframework.xingyun.sc.service.customer.CustomerCreditService;
36 36 import com.lframework.xingyun.sc.service.order.PurchaseOrderInfoService;
37 37 import com.lframework.xingyun.sc.service.order.PurchaseOrderLineService;
38 38 import com.lframework.xingyun.sc.service.statistics.OrderDetailReportService;
  39 +import com.lframework.xingyun.sc.utils.OrderDetailReportUtil;
39 40 import com.lframework.xingyun.sc.vo.order.CreatePurchaseOrderLineVo;
40 41 import com.lframework.xingyun.sc.vo.order.QueryPurchaseOrderInfoVo;
41 42 import com.lframework.xingyun.sc.vo.order.QueryPurchaseOrderLineVo;
... ... @@ -586,7 +587,8 @@ public class OrderChangeRecordServiceImpl extends BaseMpServiceImpl<OrderChangeR
586 587 vo.setQuality(line.getQuality());
587 588 vo.setContractType(orderDetailReport.getContractType());
588 589 vo.setStockUpCompanyName(orderInfo.getStockUpCompanyName());
589   - //vo.setOrderType();
  590 + vo.setType(orderInfo.getType());
  591 + vo.setOrderType(OrderDetailReportUtil.buildOrderType(type, orderInfo.getType()));
590 592 vo.setShowOrder(2);
591 593 vo.setCreateById(contractCreateById);
592 594 orderDetailReportService.create(vo);
... ...
... ... @@ -38,6 +38,7 @@ import com.lframework.xingyun.sc.service.customer.CustomerCreditService;
38 38 import com.lframework.xingyun.sc.service.order.PurchaseOrderInfoService;
39 39 import com.lframework.xingyun.sc.service.order.PurchaseOrderLineService;
40 40 import com.lframework.xingyun.sc.service.statistics.OrderDetailReportService;
  41 +import com.lframework.xingyun.sc.utils.OrderDetailReportUtil;
41 42 import com.lframework.xingyun.sc.vo.customer.credit.QueryCustomerCreditVo;
42 43 import com.lframework.xingyun.sc.vo.order.*;
43 44 import com.lframework.xingyun.sc.vo.statistics.orderDetail.CreateOrderDetailReportVo;
... ... @@ -131,8 +132,12 @@ public class PurchaseOrderInfoServiceImpl extends BaseMpServiceImpl<PurchaseOrde
131 132
132 133 @Override
133 134 public PurchaseOrderInfo findById(String id) {
134   -
135   - return getBaseMapper().findById(id);
  135 + PurchaseOrderInfo data = getBaseMapper().findById(id);
  136 + if (data == null) {
  137 + return null;
  138 + }
  139 + fillContractDestination(data);
  140 + return data;
136 141 }
137 142
138 143 @Override
... ... @@ -412,7 +417,7 @@ public class PurchaseOrderInfoServiceImpl extends BaseMpServiceImpl<PurchaseOrde
412 417 }
413 418 }
414 419 vo.setStockUpCompanyName(purchaseOrderInfo.getStockUpCompanyName());
415   -// vo.setOrderType();
  420 + vo.setOrderType(OrderDetailReportUtil.buildOrderType(type, purchaseOrderInfo.getType()));
416 421 vo.setShowOrder(0);
417 422 vo.setType(purchaseOrderInfo.getType());
418 423 vo.setCreateById(purchaseOrderInfo.getContractCreateById());
... ... @@ -763,17 +768,46 @@ public class PurchaseOrderInfoServiceImpl extends BaseMpServiceImpl<PurchaseOrde
763 768 }
764 769 Map<String, ContractDistributorStandard> contractMap = contractList.stream().collect(Collectors.toMap(ContractDistributorStandard::getId, Function.identity()));
765 770 for (PurchaseOrderInfo orderInfo : orderInfoList) {
766   - String contractId = orderInfo.getContractId();
767   - ContractDistributorStandard contract = contractMap.get(contractId);
768   - if (contract == null) {
769   - continue;
770   - }
771   - orderInfo.setDestination(contract.getDestination());
772   - orderInfo.setForeignDestination(contract.getForeignDestination());
  771 + fillContractDestination(orderInfo, contractMap);
773 772 }
774 773 return orderInfoList;
775 774 }
776 775
  776 + /**
  777 + * 回填订货单上的合同目的地字段,供打印等场景使用。
  778 + *
  779 + * @param orderInfo 订货单
  780 + */
  781 + private void fillContractDestination(PurchaseOrderInfo orderInfo) {
  782 + if (orderInfo == null || StringUtils.isBlank(orderInfo.getContractId())) {
  783 + return;
  784 + }
  785 + ContractDistributorStandard contract = contractDistributorStandardService.findById(orderInfo.getContractId());
  786 + if (contract == null) {
  787 + return;
  788 + }
  789 + orderInfo.setDestination(contract.getDestination());
  790 + orderInfo.setForeignDestination(contract.getForeignDestination());
  791 + }
  792 +
  793 + /**
  794 + * 根据合同映射批量回填订货单上的合同目的地字段。
  795 + *
  796 + * @param orderInfo 订货单
  797 + * @param contractMap 合同映射
  798 + */
  799 + private void fillContractDestination(PurchaseOrderInfo orderInfo, Map<String, ContractDistributorStandard> contractMap) {
  800 + if (orderInfo == null || contractMap == null || StringUtils.isBlank(orderInfo.getContractId())) {
  801 + return;
  802 + }
  803 + ContractDistributorStandard contract = contractMap.get(orderInfo.getContractId());
  804 + if (contract == null) {
  805 + return;
  806 + }
  807 + orderInfo.setDestination(contract.getDestination());
  808 + orderInfo.setForeignDestination(contract.getForeignDestination());
  809 + }
  810 +
777 811 @Override
778 812 public List<PurchaseOrderInfo> listByCustomerIds(List<String> customerIds) {
779 813 if (CollectionUtils.isEmpty(customerIds)) {
... ...
... ... @@ -26,6 +26,7 @@ import com.lframework.xingyun.sc.service.customer.CustomerCreditService;
26 26 import com.lframework.xingyun.sc.service.order.PurchaseOrderInfoService;
27 27 import com.lframework.xingyun.sc.service.order.PurchaseOrderLineService;
28 28 import com.lframework.xingyun.sc.service.statistics.OrderDetailReportService;
  29 +import com.lframework.xingyun.sc.utils.OrderDetailReportUtil;
29 30 import com.lframework.xingyun.sc.vo.order.QueryPurchaseOrderInfoVo;
30 31 import com.lframework.xingyun.sc.vo.order.QueryPurchaseOrderLineVo;
31 32 import com.lframework.xingyun.sc.vo.statistics.orderDetail.CreateOrderDetailReportVo;
... ... @@ -408,7 +409,7 @@ public class OrderDetailReportServiceImpl extends BaseMpServiceImpl<OrderDetailR
408 409 }
409 410 }
410 411 vo.setStockUpCompanyName(purchaseOrderInfo.getStockUpCompanyName());
411   - //vo.setOrderType();
  412 + vo.setOrderType(OrderDetailReportUtil.buildOrderType(type, purchaseOrderInfo.getType()));
412 413 vo.setShowOrder(0);
413 414 vo.setType(purchaseOrderInfo.getType());
414 415 vo.setCreateById(purchaseOrderInfo.getContractCreateById());
... ...
1 1 package com.lframework.xingyun.sc.utils;
2 2
  3 +import com.lframework.starter.web.core.utils.ApplicationUtil;
  4 +import com.lframework.starter.web.inner.dto.dic.city.DicCityDto;
  5 +import com.lframework.starter.web.inner.service.DicCityService;
3 6 import lombok.extern.slf4j.Slf4j;
  7 +import org.apache.commons.lang3.StringUtils;
4 8 import org.apache.poi.ss.usermodel.*;
5 9 import org.apache.poi.ss.util.CellRangeAddress;
6 10
... ... @@ -41,6 +45,76 @@ public class ExcelUtil {
41 45 }
42 46 }
43 47
  48 + /**
  49 + * 构建打印使用的目的地文本。
  50 + * 外贸合同直接展示外贸目的地,其他合同将层级地址中的斜杠替换为中文逗号。
  51 + *
  52 + * @param contractType 合同类型
  53 + * @param destination 普通目的地
  54 + * @param foreignDestination 外贸目的地
  55 + * @return 打印使用的目的地文本
  56 + */
  57 + public static String buildPrintDestination(String contractType, String destination, String foreignDestination) {
  58 + if (isForeignContractType(contractType)) {
  59 + return StringUtils.defaultString(foreignDestination).trim();
  60 + }
  61 +
  62 + String domesticDestination = buildDomesticDestination(destination);
  63 + if (StringUtils.isNotBlank(domesticDestination)) {
  64 + return domesticDestination;
  65 + } else {
  66 + return "";
  67 + }
  68 + }
  69 +
  70 + /**
  71 + * 将国内目的地城市ID转换为中文地址路径。
  72 + *
  73 + * @param destination 目的地ID
  74 + * @return 中文地址路径
  75 + */
  76 + private static String buildDomesticDestination(String destination) {
  77 + if (StringUtils.isBlank(destination)) {
  78 + return "";
  79 + }
  80 +
  81 + try {
  82 + DicCityService dicCityService = ApplicationUtil.getBean(DicCityService.class);
  83 + List<DicCityDto> allCity = dicCityService.getAll();
  84 + List<DicCityDto> fullPath = dicCityService.getFullPath(destination, allCity);
  85 + if (fullPath == null || fullPath.isEmpty()) {
  86 + return "";
  87 + }
  88 +
  89 + StringBuilder builder = new StringBuilder();
  90 + for (DicCityDto cityDto : fullPath) {
  91 + if (cityDto == null || StringUtils.isBlank(cityDto.getName())) {
  92 + continue;
  93 + }
  94 + if (builder.length() > 0) {
  95 + builder.append(",");
  96 + }
  97 + builder.append(cityDto.getName());
  98 + }
  99 + return builder.toString();
  100 + } catch (Exception e) {
  101 + log.warn("转换国内目的地失败, destination={}", destination, e);
  102 + return "";
  103 + }
  104 + }
  105 +
  106 + /**
  107 + * 判断是否为外贸合同类型。
  108 + *
  109 + * @param contractType 合同类型
  110 + * @return true=外贸合同
  111 + */
  112 + private static boolean isForeignContractType(String contractType) {
  113 + return "INTL_STD_CONTRACT".equals(contractType)
  114 + || "INTL_INVENTORY_AGMT".equals(contractType)
  115 + || "INTL_OPEN_SPEC_AGMT".equals(contractType);
  116 + }
  117 +
44 118
45 119 /**
46 120 * 解析占位符
... ... @@ -292,17 +366,6 @@ public class ExcelUtil {
292 366
293 367 cell.setCellValue(buildVerticalText(text));
294 368
295   - CellStyle baseStyle = cell.getCellStyle();
296   - CellStyle pdfStyle = workbook.createCellStyle();
297   - if (baseStyle != null) {
298   - pdfStyle.cloneStyleFrom(baseStyle);
299   - }
300   - pdfStyle.setAlignment(HorizontalAlignment.CENTER);
301   - pdfStyle.setVerticalAlignment(VerticalAlignment.CENTER);
302   - pdfStyle.setWrapText(true);
303   - pdfStyle.setRotation((short) 0);
304   - pdfStyle.setIndention((short) 0);
305   -
306 369 if (mergedCell) {
307 370 CellRangeAddress mergedRegion = findMergedRegion(sheet, cell.getRowIndex(), cell.getColumnIndex());
308 371 if (mergedRegion != null) {
... ... @@ -316,20 +379,36 @@ public class ExcelUtil {
316 379 if (currentCell == null) {
317 380 currentCell = currentRow.createCell(c);
318 381 }
319   - currentCell.setCellStyle(pdfStyle);
  382 + currentCell.setCellStyle(buildPdfVerticalTitleStyle(workbook, currentCell.getCellStyle()));
320 383 }
321 384 }
322 385 } else {
323   - cell.setCellStyle(pdfStyle);
  386 + cell.setCellStyle(buildPdfVerticalTitleStyle(workbook, cell.getCellStyle()));
324 387 }
325 388 } else {
326   - cell.setCellStyle(pdfStyle);
  389 + cell.setCellStyle(buildPdfVerticalTitleStyle(workbook, cell.getCellStyle()));
327 390 }
328 391 return;
329 392 }
330 393 }
331 394 }
332 395
  396 + /**
  397 + * 构建 PDF 竖排标题样式,保留原单元格边框等样式,只覆盖对齐和换行属性。
  398 + */
  399 + private static CellStyle buildPdfVerticalTitleStyle(Workbook workbook, CellStyle baseStyle) {
  400 + CellStyle pdfStyle = workbook.createCellStyle();
  401 + if (baseStyle != null) {
  402 + pdfStyle.cloneStyleFrom(baseStyle);
  403 + }
  404 + pdfStyle.setAlignment(HorizontalAlignment.CENTER);
  405 + pdfStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  406 + pdfStyle.setWrapText(true);
  407 + pdfStyle.setRotation((short) 0);
  408 + pdfStyle.setIndention((short) 0);
  409 + return pdfStyle;
  410 + }
  411 +
333 412 private static String buildVerticalText(String text) {
334 413 StringBuilder builder = new StringBuilder();
335 414 for (int i = 0; i < text.length(); i++) {
... ...
... ... @@ -319,6 +319,14 @@ public class LatexFormulaExcelExporterUtil {
319 319 }
320 320
321 321 /**
  322 + * 将 LaTeX 公式作为图片左对齐插入到指定单元格区域内,并确保图片不会超出区域边界。
  323 + */
  324 + public static void insertLatexImageToCellLeftAligned(Workbook workbook, Sheet sheet, String latex,
  325 + int rowIndex, int colIndex, int rowRange, int colRange) throws IOException {
  326 + insertLatexImageToRegionLeftAligned(workbook, sheet, latex, rowIndex, colIndex, rowRange, colRange, 16, null);
  327 + }
  328 +
  329 + /**
322 330 * 合同规格专用:按照模板单元格区域高度优先铺满,并根据区域大小动态选择更合适的渲染字号。
323 331 */
324 332 public static void insertContractLatexImageToCellFillTemplate(Workbook workbook, Sheet sheet, String latex,
... ... @@ -562,6 +570,103 @@ public class LatexFormulaExcelExporterUtil {
562 570 drawing.createPicture(anchor, pictureIdx);
563 571 }
564 572
  573 + /**
  574 + * 将 LaTeX 公式作为图片左对齐插入到指定区域,并保留左右留白避免压线。
  575 + */
  576 + private static void insertLatexImageToRegionLeftAligned(Workbook workbook, Sheet sheet, String latex,
  577 + int rowIndex, int colIndex, int rowRange, int colRange,
  578 + int fontSize, Double maxScale) throws IOException {
  579 + byte[] imageBytes = latexToImageBytes(latex, fontSize);
  580 + BufferedImage image;
  581 + try (ByteArrayInputStream in = new ByteArrayInputStream(imageBytes)) {
  582 + image = ImageIO.read(in);
  583 + }
  584 +
  585 + if (image == null) {
  586 + return;
  587 + }
  588 +
  589 + int regionWidthPx = 0;
  590 + for (int c = colIndex; c < colIndex + colRange; c++) {
  591 + regionWidthPx += getColumnWidthPx(sheet, c);
  592 + }
  593 + int regionHeightPx = 0;
  594 + for (int r = rowIndex; r < rowIndex + rowRange; r++) {
  595 + regionHeightPx += getRowHeightPx(sheet, r);
  596 + }
  597 +
  598 + int paddingXPx = 6;
  599 + int paddingYPx = 2;
  600 + double scale = Math.min(
  601 + (double) (regionWidthPx - paddingXPx * 2) / Math.max(1, image.getWidth()),
  602 + (double) (regionHeightPx - paddingYPx * 2) / Math.max(1, image.getHeight())
  603 + );
  604 + scale = Math.min(scale, 1.0);
  605 + if (maxScale != null) {
  606 + scale = Math.min(scale, maxScale);
  607 + }
  608 +
  609 + int scaledWidthPx = Math.max(1, (int) Math.round(image.getWidth() * scale));
  610 + int scaledHeightPx = Math.max(1, (int) Math.round(image.getHeight() * scale));
  611 +
  612 + int offsetXPx = paddingXPx;
  613 + int offsetYPx = Math.max(paddingYPx, (regionHeightPx - scaledHeightPx) / 2);
  614 +
  615 + int pictureIdx = workbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_PNG);
  616 + Drawing<?> drawing = sheet.createDrawingPatriarch();
  617 +
  618 + ClientAnchor anchor = workbook.getCreationHelper().createClientAnchor();
  619 + anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE);
  620 +
  621 + AnchorCoord x1 = resolveAnchorX(sheet, colIndex, colRange, offsetXPx);
  622 + AnchorCoord x2 = resolveAnchorX(sheet, colIndex, colRange, offsetXPx + scaledWidthPx);
  623 + AnchorCoord y1 = resolveAnchorY(sheet, rowIndex, rowRange, offsetYPx);
  624 + AnchorCoord y2 = resolveAnchorY(sheet, rowIndex, rowRange, offsetYPx + scaledHeightPx);
  625 +
  626 + anchor.setCol1(x1.index);
  627 + anchor.setCol2(x2.index);
  628 + anchor.setRow1(y1.index);
  629 + anchor.setRow2(y2.index);
  630 +
  631 + if (anchor instanceof org.apache.poi.hssf.usermodel.HSSFClientAnchor) {
  632 + int dx1 = pxToHssfDx(sheet, x1.index, x1.offsetPx);
  633 + int dx2 = pxToHssfDx(sheet, x2.index, x2.offsetPx);
  634 + int dy1 = pxToHssfDy(sheet, y1.index, y1.offsetPx);
  635 + int dy2 = pxToHssfDy(sheet, y2.index, y2.offsetPx);
  636 +
  637 + if (x2.index == x1.index && dx2 <= dx1) {
  638 + dx2 = Math.min(1023, dx1 + 1);
  639 + }
  640 + if (y2.index == y1.index && dy2 <= dy1) {
  641 + dy2 = Math.min(255, dy1 + 1);
  642 + }
  643 +
  644 + anchor.setDx1(dx1);
  645 + anchor.setDx2(dx2);
  646 + anchor.setDy1(dy1);
  647 + anchor.setDy2(dy2);
  648 + } else {
  649 + int dx1 = x1.offsetPx * EMU_PER_PX;
  650 + int dx2 = x2.offsetPx * EMU_PER_PX;
  651 + int dy1 = y1.offsetPx * EMU_PER_PX;
  652 + int dy2 = y2.offsetPx * EMU_PER_PX;
  653 +
  654 + if (x2.index == x1.index && dx2 <= dx1) {
  655 + dx2 = dx1 + 1;
  656 + }
  657 + if (y2.index == y1.index && dy2 <= dy1) {
  658 + dy2 = dy1 + 1;
  659 + }
  660 +
  661 + anchor.setDx1(dx1);
  662 + anchor.setDx2(dx2);
  663 + anchor.setDy1(dy1);
  664 + anchor.setDy2(dy2);
  665 + }
  666 +
  667 + drawing.createPicture(anchor, pictureIdx);
  668 + }
  669 +
565 670 private static void insertContractLatexImageToRegionFillTemplate(Workbook workbook, Sheet sheet, String latex,
566 671 int rowIndex, int colIndex, int rowRange, int colRange,
567 672 int baseFontSize, Double maxScale) throws IOException {
... ...
  1 +package com.lframework.xingyun.sc.utils;
  2 +
  3 +/**
  4 + * 订单明细报表工具类。
  5 + */
  6 +public final class OrderDetailReportUtil {
  7 +
  8 + private OrderDetailReportUtil() {
  9 + }
  10 +
  11 + /**
  12 + * 根据合同类型和订货单类型构建订单类型展示值。
  13 + *
  14 + * @param contractType 合同类型
  15 + * @param purchaseOrderType 订货单类型
  16 + * @return 订单类型展示值
  17 + */
  18 + public static String buildOrderType(String contractType, String purchaseOrderType) {
  19 + if ("DISTRIB_STD".equals(contractType)) {
  20 + return "经销";
  21 + }
  22 + if ("INTL_STD_CONTRACT".equals(contractType)) {
  23 + return "外贸";
  24 + }
  25 + if ("PROCESS_STD_AGMT".equals(contractType)) {
  26 + return "加工";
  27 + }
  28 + if ("DIST_STOCK_CONTRACT".equals(contractType) || "INTL_INVENTORY_AGMT".equals(contractType)) {
  29 + if ("NO_PRODUCTION".equals(purchaseOrderType)) {
  30 + return "库存已锁价";
  31 + }
  32 + if ("PRODUCTION".equals(purchaseOrderType)) {
  33 + return "库存未锁价";
  34 + }
  35 + return "库存";
  36 + }
  37 + if ("DRAFT_DIST_AGMT".equals(contractType) || "INTL_OPEN_SPEC_AGMT".equals(contractType)) {
  38 + if ("NO_PRODUCTION".equals(purchaseOrderType)) {
  39 + return "未锁规";
  40 + }
  41 + if ("PRODUCTION".equals(purchaseOrderType)) {
  42 + return "已锁规";
  43 + }
  44 + return "未锁规";
  45 + }
  46 + return "";
  47 + }
  48 +}
... ...