From 6c3d8408c2ae5053ac34ea4ab8f465077ca6108f Mon Sep 17 00:00:00 2001 From: wwb <782276617@qq.com> Date: Mon, 5 Jan 2026 20:59:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=B9=E8=B4=A6=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/oms/enums/ErrorCodeConstants.java | 2 + .../DeliveryOrderController.java | 186 +++++++++ .../vo/DeliveryOrderPageReqVO.java | 67 +++ .../deliveryorder/vo/DeliveryOrderRespVO.java | 98 +++++ .../vo/DeliveryOrderSaveReqVO.java | 76 ++++ .../admin/saleorder/SaleOrderController.java | 15 + .../admin/saleorder/vo/SaleOrderRespVO.java | 1 - .../StatementAccountController.java | 273 ++++++++++++ .../vo/StatementAccountCustomExcelVO.java | 84 ++++ .../vo/StatementAccountPageReqVO.java | 33 ++ .../vo/StatementAccountRespVO.java | 46 +++ .../vo/StatementAccountSaveReqVO.java | 34 ++ .../deliveryrder/DeliveryOrderConvert.java | 33 ++ .../StatementAccountConvert.java | 33 ++ .../deliveryorder/DeliveryOrderDO.java | 103 +++++ .../deliveryorder/DeliveryOrderEntryDO.java | 74 ++++ .../statementaccount/StatementAccountDO.java | 46 +++ .../StatementAccountEntryDO.java | 93 +++++ .../DeliveryOrderEntryMapper.java | 28 ++ .../deliveryorder/DeliveryOrderMapper.java | 40 ++ .../dal/mysql/saleorder/SaleOrderMapper.java | 10 + .../StatementAccountEntryMapper.java | 25 ++ .../StatementAccountMapper.java | 29 ++ .../module/oms/job/StatementActJob.java | 28 ++ .../deliveryorder/DeliveryOrderService.java | 80 ++++ .../DeliveryOrderServiceImpl.java | 387 ++++++++++++++++++ .../service/saleorder/SaleOrderService.java | 9 +- .../saleorder/SaleOrderServiceImpl.java | 80 +++- .../StatementAccountService.java | 78 ++++ .../StatementAccountServiceImpl.java | 259 ++++++++++++ .../deliveryorder/DeliveryOrderMapper.xml | 31 ++ .../mapper/saleorder/SaleOrderMapper.xml | 25 ++ .../StatementAccountMapper.xml | 24 ++ .../templates/dzd_excel_templates.xlsx | Bin 0 -> 11467 bytes .../templates/sendorder_pdf_template.html | 292 +++++++++++++ .../src/api/oms/deliveryorder/index.ts | 69 ++++ .../src/api/oms/saleorder/index.ts | 14 +- .../src/api/oms/statementaccount/index.ts | 55 +++ .../hangtag-ui-admin/src/utils/formatTime.ts | 11 + .../oms/deliveryorder/DeliveryOrderForm.vue | 207 ++++++++++ .../components/DeliveryOrderEntryForm.vue | 126 ++++++ .../src/views/oms/deliveryorder/index.vue | 333 +++++++++++++++ .../src/views/oms/saleorder/detail/index.vue | 97 ++++- .../src/views/oms/saleorder/index.vue | 6 +- .../statementaccount/StatementAccountForm.vue | 129 ++++++ .../components/StatementAccountEntryForm.vue | 180 ++++++++ .../src/views/oms/statementaccount/index.vue | 224 ++++++++++ 47 files changed, 4162 insertions(+), 11 deletions(-) create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/DeliveryOrderController.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderPageReqVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderRespVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderSaveReqVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/StatementAccountController.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountCustomExcelVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountPageReqVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountRespVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountSaveReqVO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/convert/deliveryrder/DeliveryOrderConvert.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/convert/statementaccount/StatementAccountConvert.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/deliveryorder/DeliveryOrderDO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/deliveryorder/DeliveryOrderEntryDO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/statementaccount/StatementAccountDO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/statementaccount/StatementAccountEntryDO.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/deliveryorder/DeliveryOrderEntryMapper.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/deliveryorder/DeliveryOrderMapper.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/statementaccount/StatementAccountEntryMapper.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/statementaccount/StatementAccountMapper.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/job/StatementActJob.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/deliveryorder/DeliveryOrderService.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/deliveryorder/DeliveryOrderServiceImpl.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/statementaccount/StatementAccountService.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/statementaccount/StatementAccountServiceImpl.java create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/deliveryorder/DeliveryOrderMapper.xml create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/statementaccount/StatementAccountMapper.xml create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/dzd_excel_templates.xlsx create mode 100644 hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/sendorder_pdf_template.html create mode 100644 hangtag-ui/hangtag-ui-admin/src/api/oms/deliveryorder/index.ts create mode 100644 hangtag-ui/hangtag-ui-admin/src/api/oms/statementaccount/index.ts create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/DeliveryOrderForm.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/components/DeliveryOrderEntryForm.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/index.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/StatementAccountForm.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/components/StatementAccountEntryForm.vue create mode 100644 hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/index.vue diff --git a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java index 53dca8c..ddeda7f 100644 --- a/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java +++ b/hangtag-module-oms/hangtag-module-oms-api/src/main/java/cn/hangtag/module/oms/enums/ErrorCodeConstants.java @@ -29,4 +29,6 @@ public interface ErrorCodeConstants extends cn.hangtag.module.system.enums.Erro ErrorCode SALE_ORDER_NOT_FILE_EXPORT = new ErrorCode(7000, "订单中没有可导出的稿件"); ErrorCode SALE_ORDER_NOT_ATTRFILE_EXPORT = new ErrorCode(7000, "订单中没有可导出的附件"); ErrorCode CUSTOMER_GROUP_NOT_EXISTS = new ErrorCode(7100, "客户组别 不存在"); + ErrorCode DELIVERY_ORDER_NOT_EXISTS = new ErrorCode(8000, "送货单不存在"); + ErrorCode STATEMENT_ACCOUNT_NOT_EXISTS = new ErrorCode(9000, "对账单不存在"); } diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/DeliveryOrderController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/DeliveryOrderController.java new file mode 100644 index 0000000..583b88e --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/DeliveryOrderController.java @@ -0,0 +1,186 @@ +package cn.hangtag.module.oms.controller.admin.deliveryorder; + +import cn.hangtag.framework.apilog.core.annotation.ApiAccessLog; +import cn.hangtag.framework.common.pojo.CommonResult; +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.util.object.BeanUtils; +import cn.hangtag.framework.excel.core.util.ExcelUtils; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.DeliveryOrderPageReqVO; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.DeliveryOrderRespVO; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.DeliveryOrderSaveReqVO; +import cn.hangtag.module.oms.convert.deliveryrder.DeliveryOrderConvert; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderEntryDO; +import cn.hangtag.module.oms.service.customer.CustomerService; +import cn.hangtag.module.oms.service.deliveryorder.DeliveryOrderService; +import cn.hangtag.module.system.dal.dataobject.user.AdminUserDO; +import cn.hangtag.module.system.service.user.AdminUserService; +import cn.hutool.core.collection.CollUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.annotation.security.PermitAll; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.*; + +import static cn.hangtag.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.hangtag.framework.common.pojo.CommonResult.success; +import static cn.hangtag.framework.common.util.collection.CollectionUtils.convertList; + +@Tag(name = "管理后台 - 送货单") +@RestController +@RequestMapping("/oms/delivery-order") +@Validated +public class DeliveryOrderController { + + @Resource + private DeliveryOrderService deliveryOrderService; + @Resource + private CustomerService customerService; + @Resource + private AdminUserService adminUserService; + + @PostMapping("/create") + @Operation(summary = "创建送货单") + @PreAuthorize("@ss.hasPermission('oms:delivery-order:create')") + public CommonResult createDeliveryOrder(@Valid @RequestBody DeliveryOrderSaveReqVO createReqVO) { + return success(deliveryOrderService.createDeliveryOrder(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新送货单") + @PreAuthorize("@ss.hasPermission('oms:delivery-order:update')") + public CommonResult updateDeliveryOrder(@Valid @RequestBody DeliveryOrderSaveReqVO updateReqVO) { + deliveryOrderService.updateDeliveryOrder(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除送货单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('oms:delivery-order:delete')") + public CommonResult deleteDeliveryOrder(@RequestParam("id") Long id) { + deliveryOrderService.deleteDeliveryOrder(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得送货单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('oms:delivery-order:query')") + public CommonResult getDeliveryOrder(@RequestParam("id") Long id) { + DeliveryOrderDO deliveryOrder = deliveryOrderService.getDeliveryOrder(id); + String salesPersonIds = deliveryOrder.getSalesPersonIds(); + StringBuffer personText = new StringBuffer(); + if(StringUtils.isNotBlank(salesPersonIds)){ + String[] split = salesPersonIds.split(";"); + Long[] userIds = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).toArray(Long[]::new); + List userList = adminUserService.getUserList(Arrays.asList(userIds)); + for (AdminUserDO adminUserDO : userList) { + if(personText.length()==0){ + personText.append(adminUserDO.getUsername()); + }else { + personText.append(adminUserDO.getUsername()+"; "); + } + } + } + DeliveryOrderRespVO deliveryOrderRespVO = BeanUtils.toBean(deliveryOrder, DeliveryOrderRespVO.class); + deliveryOrderRespVO.setSalesPersonNames(personText.toString()); + return success(deliveryOrderRespVO); + } + + @GetMapping("/page") + @Operation(summary = "获得送货单分页") + @PreAuthorize("@ss.hasPermission('oms:delivery-order:query')") + public CommonResult> getDeliveryOrderPage(@Valid DeliveryOrderPageReqVO pageReqVO) { + PageResult pageResult = deliveryOrderService.getDeliveryOrderPage(pageReqVO); + + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); + } + // 拼接数据 + Map customerMap = customerService.getCustomerMap( + convertList(pageResult.getList(), DeliveryOrderDO::getCustomerId)); + + + PageResult saleOrderRespVOPageResult = new PageResult<>(DeliveryOrderConvert.INSTANCE.convertList(pageResult.getList(), customerMap), + pageResult.getTotal()); + saleOrderRespVOPageResult.setOtherMap(pageResult.getOtherMap()); + + + //封装数据 + //999999L 为客户 + //1000000L 为业务员 + Map userMap = new HashMap<>(); + List userListByDeptIds = adminUserService.getUserListByDeptIds(Collections.singletonList(1000000L)); + for (AdminUserDO adminUserDO : userListByDeptIds) { + userMap.put(adminUserDO.getId(),adminUserDO); + } + + List list = saleOrderRespVOPageResult.getList(); + for (DeliveryOrderRespVO deliveryOrderRespVO : list) { + String salesPersonIds = deliveryOrderRespVO.getSalesPersonIds(); + StringBuffer personText = new StringBuffer(); + if(StringUtils.isNotBlank(salesPersonIds)){ + String[] split = salesPersonIds.split(";"); + Long[] userIds = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).toArray(Long[]::new); + for (Long userId : userIds) { + AdminUserDO adminUserDO = userMap.get(userId); + if(adminUserDO!=null){ + if(personText.length()==0){ + personText.append(adminUserDO.getUsername()); + }else { + personText.append(adminUserDO.getUsername()+"; "); + } + } + } + deliveryOrderRespVO.setSalesPersonNames(personText.toString()); + } + } + return success(saleOrderRespVOPageResult); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出送货单 Excel") + @PreAuthorize("@ss.hasPermission('oms:delivery-order:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportDeliveryOrderExcel(@Valid DeliveryOrderPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = deliveryOrderService.getDeliveryOrderPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "送货单.xls", "数据", DeliveryOrderRespVO.class, + BeanUtils.toBean(list, DeliveryOrderRespVO.class)); + } + + + + @GetMapping("/exportPdf") + @Operation(summary = "导出PDF") + @PermitAll + public void exportPdf(@RequestParam("ids") List ids,HttpServletResponse response) throws IOException { + deliveryOrderService.generatePdf(response,ids); + } + + + // ==================== 子表(送货单明细) ==================== + + @GetMapping("/delivery-order-entry/list-by-parent-id") + @Operation(summary = "获得送货单明细列表") + @Parameter(name = "parentId", description = "主表ID") + @PreAuthorize("@ss.hasPermission('oms:delivery-order:query')") + public CommonResult> getDeliveryOrderEntryListByParentId(@RequestParam("parentId") Long parentId) { + return success(deliveryOrderService.getDeliveryOrderEntryListByParentId(parentId)); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderPageReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderPageReqVO.java new file mode 100644 index 0000000..284cb9b --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderPageReqVO.java @@ -0,0 +1,67 @@ +package cn.hangtag.module.oms.controller.admin.deliveryorder.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.hangtag.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.hangtag.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 送货单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DeliveryOrderPageReqVO extends PageParam { + + @Schema(description = "单据编号") + private String billno; + + @Schema(description = "销售订单号") + private String saleorderNo; + + @Schema(description = "下单日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] saleorderDate; + + @Schema(description = "日期") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] date; + + @Schema(description = "物流公司") + private String logisticsCompany; + + @Schema(description = "物流编码") + private String logisticsCode; + + @Schema(description = "联系人") + private String contact; + + @Schema(description = "联系人手机号") + private String phone; + + @Schema(description = "销售订单ID", example = "3044") + private Long saleorderId; + + @Schema(description = "客户ID", example = "6168") + private Long customerId; + + @Schema(description = "客户名称", example = "6168") + private String customerName; + + @Schema(description = "业务员id") + private String salesPersonIds; + + @Schema(description = "客户采购编号") + private String customerPurNo; + + @Schema(description = "销售合约号") + private String saleContractNo; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderRespVO.java new file mode 100644 index 0000000..ccb5d42 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderRespVO.java @@ -0,0 +1,98 @@ +package cn.hangtag.module.oms.controller.admin.deliveryorder.vo; + +import cn.hangtag.module.oms.controller.admin.customer.vo.CustomerRespVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 送货单 Response VO") +@Data +@ExcelIgnoreUnannotated +public class DeliveryOrderRespVO { + + @Schema(description = "单据编号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("单据编号") + private String billno; + + @Schema(description = "销售订单号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("销售订单号") + private String saleorderNo; + + @ExcelProperty("下单日期") + private LocalDateTime saleorderDate; + + @Schema(description = "日期") + @ExcelProperty("日期") + private LocalDateTime date; + + @Schema(description = "收货地址") + @ExcelProperty("收货地址") + private String address; + + @Schema(description = "物流公司") + @ExcelProperty("物流公司") + private String logisticsCompany; + + @Schema(description = "物流编码") + @ExcelProperty("物流编码") + private String logisticsCode; + + @Schema(description = "联系人") + @ExcelProperty("联系人") + private String contact; + + @Schema(description = "联系人手机号") + @ExcelProperty("联系人手机号") + private String phone; + + @Schema(description = "电话") + @ExcelProperty("电话") + private String tel; + + @Schema(description = "总数量") + @ExcelProperty("总数量") + private Integer totalQty; + + @Schema(description = "总金额") + @ExcelProperty("总金额") + private BigDecimal totalAmount; + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6675") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "销售订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3044") + private Long saleorderId; + + @Schema(description = "客户ID数组", example = "6168") + @ExcelProperty("客户ID数组") + private Long customerId; + + @Schema(description = "业务员id") + @ExcelProperty("业务员id") + private String salesPersonIds; + + @Schema(description = "业务员名称") + @ExcelProperty("业务员名称") + private String salesPersonNames; + + @Schema(description = "客户采购编号") + @ExcelProperty("客户采购编号") + private String customerPurNo; + + @Schema(description = "销售合约号") + @ExcelProperty("销售合约号") + private String saleContractNo; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "客户") + private CustomerRespVO customer; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderSaveReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderSaveReqVO.java new file mode 100644 index 0000000..3d2bdc2 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/deliveryorder/vo/DeliveryOrderSaveReqVO.java @@ -0,0 +1,76 @@ +package cn.hangtag.module.oms.controller.admin.deliveryorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderEntryDO; + +@Schema(description = "管理后台 - 送货单新增/修改 Request VO") +@Data +public class DeliveryOrderSaveReqVO { + + @Schema(description = "单据编号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "单据编号不能为空") + private String billno; + + @Schema(description = "销售订单号", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "销售订单号不能为空") + private String saleorderNo; + + @Schema(description = "下单日期") + private LocalDateTime saleorderDate; + + @Schema(description = "日期") + private LocalDateTime date; + + @Schema(description = "收货地址") + private String address; + + @Schema(description = "物流公司") + private String logisticsCompany; + + @Schema(description = "物流编码") + private String logisticsCode; + + @Schema(description = "联系人") + private String contact; + + @Schema(description = "联系人手机号") + private String phone; + + @Schema(description = "电话") + private String tel; + + @Schema(description = "总数量") + private Integer totalQty; + + @Schema(description = "总金额") + private BigDecimal totalAmount; + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6675") + private Long id; + + @Schema(description = "销售订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3044") + @NotNull(message = "销售订单ID不能为空") + private Long saleorderId; + + @Schema(description = "客户ID数组", example = "6168") + private Long customerId; + + @Schema(description = "业务员id") + private String salesPersonIds; + + @Schema(description = "客户采购编号") + private String customerPurNo; + + @Schema(description = "销售合约号") + private String saleContractNo; + + @Schema(description = "送货单明细列表") + private List deliveryOrderEntrys; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderController.java index 0f28685..1981094 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderController.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/SaleOrderController.java @@ -273,4 +273,19 @@ public class SaleOrderController { saleOrderService.exportAttrFile(response,id); } + + @PostMapping("/updatePushDeliveryOrder") + @Operation(summary = "下推生成发货单") + @PreAuthorize("@ss.hasPermission('oms:sale-order:updatePushDeliveryOrder')") + public CommonResult updatePushDeliveryOrder(@RequestBody JSONObject jobs) { + Long[] ids = jobs.getObject("ids", new Long[0].getClass()); + String logisticsCompany = jobs.getString("logisticsCompany"); + String logisticsCode = jobs.getString("logisticsCode"); + saleOrderService.updatePushDeliveryOrder(Arrays.asList(ids),logisticsCompany,logisticsCode); + return success(true); + } + + + + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderRespVO.java index 556e176..a25f6ee 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderRespVO.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/saleorder/vo/SaleOrderRespVO.java @@ -29,7 +29,6 @@ public class SaleOrderRespVO { private String billno; @Schema(description = "销售合约号前缀", example = "2") - @ExcelProperty("销售合约号前缀") private String saleContractCodePrefix; @Schema(description = "销售合约号", example = "2") diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/StatementAccountController.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/StatementAccountController.java new file mode 100644 index 0000000..f6347bb --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/StatementAccountController.java @@ -0,0 +1,273 @@ +package cn.hangtag.module.oms.controller.admin.statementaccount; + +import cn.hangtag.framework.apilog.core.annotation.ApiAccessLog; +import cn.hangtag.framework.common.pojo.CommonResult; +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.util.object.BeanUtils; +import cn.hangtag.framework.excel.core.util.ExcelUtils; +import cn.hangtag.module.oms.controller.admin.statementaccount.vo.StatementAccountCustomExcelVO; +import cn.hangtag.module.oms.controller.admin.statementaccount.vo.StatementAccountPageReqVO; +import cn.hangtag.module.oms.controller.admin.statementaccount.vo.StatementAccountRespVO; +import cn.hangtag.module.oms.controller.admin.statementaccount.vo.StatementAccountSaveReqVO; +import cn.hangtag.module.oms.convert.statementaccount.StatementAccountConvert; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderDO; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountDO; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountEntryDO; +import cn.hangtag.module.oms.dal.mysql.statementaccount.StatementAccountMapper; +import cn.hangtag.module.oms.service.customer.CustomerService; +import cn.hangtag.module.oms.service.statementaccount.StatementAccountService; +import cn.hangtag.module.system.convert.user.UserConvert; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.resource.ResourceUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.util.ListUtils; +import com.alibaba.excel.util.MapUtils; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.net.URL; +import java.net.URLEncoder; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; + +import static cn.hangtag.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.hangtag.framework.common.pojo.CommonResult.success; +import static cn.hangtag.framework.common.util.collection.CollectionUtils.convertList; + +@Tag(name = "管理后台 - 对账单") +@RestController +@RequestMapping("/oms/statement-account") +@Validated +@Slf4j +public class StatementAccountController { + + @Resource + private StatementAccountService statementAccountService; + + @Resource + private StatementAccountMapper statementAccountMapper; + + @Resource + private CustomerService customerService; + + @PostMapping("/create") + @Operation(summary = "创建对账单") + @PreAuthorize("@ss.hasPermission('oms:statement-account:create')") + public CommonResult createStatementAccount(@Valid @RequestBody StatementAccountSaveReqVO createReqVO) { + return success(statementAccountService.createStatementAccount(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新对账单") + @PreAuthorize("@ss.hasPermission('oms:statement-account:update')") + public CommonResult updateStatementAccount(@Valid @RequestBody StatementAccountSaveReqVO updateReqVO) { + statementAccountService.updateStatementAccount(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除对账单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('oms:statement-account:delete')") + public CommonResult deleteStatementAccount(@RequestParam("id") Long id) { + statementAccountService.deleteStatementAccount(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得对账单") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('oms:statement-account:query')") + public CommonResult getStatementAccount(@RequestParam("id") Long id) { + StatementAccountDO statementAccount = statementAccountService.getStatementAccount(id); + StatementAccountRespVO statementAccountRespVO = BeanUtils.toBean(statementAccount, StatementAccountRespVO.class); + if(statementAccountRespVO!=null){ + Long customerId = statementAccountRespVO.getCustomerId(); + CustomerDO customer = customerService.getCustomer(customerId); + if(customer!=null){ + statementAccountRespVO.setCustomerId(customerId); + statementAccountRespVO.setCustomerNumber(customer.getNumber()); + statementAccountRespVO.setCustomerName(customer.getName()); + } + } + return success(statementAccountRespVO); + } + + @GetMapping("/page") + @Operation(summary = "获得对账单分页") + @PreAuthorize("@ss.hasPermission('oms:statement-account:query')") + public CommonResult> getStatementAccountPage(@Valid StatementAccountPageReqVO pageReqVO) { + LocalDateTime[] date = pageReqVO.getDate(); + if(date!=null && date.length>=2){ + DateTime beginDate = DateUtil.beginOfMonth(new Date(date[0].atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())); + DateTime endDate = DateUtil.endOfMonth(new Date(date[1].atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())); + date[0] = beginDate.toLocalDateTime(); + date[1] = endDate.toLocalDateTime(); + pageReqVO.setDate(date); + } + PageResult pageResult = statementAccountService.getStatementAccountPage(pageReqVO); + + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); + } + + // 拼接数据 + Map customerMap = customerService.getCustomerMap( + convertList(pageResult.getList(), StatementAccountDO::getCustomerId)); + + PageResult respVOPageResult = new PageResult<>(StatementAccountConvert.INSTANCE.convertList(pageResult.getList(), customerMap), + pageResult.getTotal()); + respVOPageResult.setOtherMap(pageResult.getOtherMap()); + + return success(respVOPageResult); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出对账单 Excel") + @PreAuthorize("@ss.hasPermission('oms:statement-account:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportStatementAccountExcel(@Valid StatementAccountPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = statementAccountService.getStatementAccountPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "对账单.xls", "数据", StatementAccountRespVO.class,BeanUtils.toBean(list, StatementAccountRespVO.class)); + } + + // ==================== 子表(对账单明细) ==================== + + @GetMapping("/statement-account-entry/list-by-parent-id") + @Operation(summary = "获得对账单明细列表") + @Parameter(name = "parentId", description = "主表ID") + @PreAuthorize("@ss.hasPermission('oms:statement-account:query')") + public CommonResult> getStatementAccountEntryListByParentId(@RequestParam("parentId") Long parentId) { + return success(statementAccountService.getStatementAccountEntryListByParentId(parentId)); + } + + + @GetMapping("/export-excel2") + @Operation(summary = "导出对账单 Excel") + @PreAuthorize("@ss.hasPermission('oms:statement-account:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportStatementAccountExcel(@RequestParam("ids") List ids, + HttpServletResponse response) throws IOException { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.in(StatementAccountDO::getId, ids); + List list = statementAccountMapper.selectList(lambdaQueryWrapper); + // 导出 Excel + //ExcelUtils.write(response, "对账单.xls", "数据", StatementAccountRespVO.class,BeanUtils.toBean(list, StatementAccountRespVO.class)); + List delFiles = new ArrayList<>(); + List files = new ArrayList<>(); + + for (StatementAccountDO statementAccount : list) { + List models = new ArrayList<>(); + CustomerDO customer = customerService.getCustomer(statementAccount.getCustomerId()); + BigDecimal totalAmount = BigDecimal.ZERO; + + List entrys = statementAccountService.getStatementAccountEntryListByParentId(statementAccount.getId()); + for (StatementAccountEntryDO entry : entrys) { + StatementAccountCustomExcelVO model = new StatementAccountCustomExcelVO(); + model.setBillno(statementAccount.getBillno()); + if(entry.getOrderDate()!=null){ + model.setSaleorderDate(DateUtil.date(entry.getOrderDate().toLocalDate()).toString("yyyy/MM/dd")); + } + if(entry.getDeliveryDate()!=null){ + model.setDeliveryDate(DateUtil.date(entry.getDeliveryDate().toLocalDate()).toString("yyyy/MM/dd")); + } + model.setSaleorderNo(entry.getSaleContractNo()); + model.setContact(entry.getContact()); + model.setMaterialCode(entry.getMaterialCode()); + model.setCustomerNo(entry.getMaterialName()); + model.setSaleContractNo(entry.getSaleContractNo()); + + model.setQty(entry.getQty()); + model.setPrice(entry.getPrice()); + model.setAmount(entry.getAmount()); + model.setUnit(entry.getUnit()); + models.add(model); + totalAmount = totalAmount.add(entry.getAmount()); + } + // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替 + // 填充list 的时候还要注意 模板中{.} 多了个点 表示list + // 如果填充list的对象是map,必须包涵所有list的key,哪怕数据为null,必须使用map.put(key,null) + //docker生成路径 + URL templateFileUrl = ResourceUtil.getResource("templates/dzd_excel_templates.xlsx"); + + String pathUrl = System.getProperty("user.dir") + "/pdffile"; + + String fileName = pathUrl+"/对账单-"+customer.getName()+"-"+DateUtil.date(statementAccount.getDate().toLocalDate()).toString("YYYYMM")+".xlsx"; + try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileUrl.getPath()).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + // 直接写入数据 + excelWriter.fill(models, writeSheet); + + // 写入list之前的数据 + Map map = new HashMap(); + + map.put("headTitle", DateUtil.date(statementAccount.getDate().toLocalDate()).toString("yyyy年MM月")+"对账单"); + String customerTitle = ""; + if(customer!=null){ + customerTitle = customer.getName() + " "+customer.getNumber(); + } + map.put("headCustomerName", "客户名称:"+customerTitle); + map.put("totalAmount",totalAmount); + excelWriter.fill(map, writeSheet); + + File file = FileUtil.file(fileName); + files.add(file); + delFiles.add(fileName); + } + } + + String pathUrl = System.getProperty("user.dir") + "/pdffile"; + String zipFileName = StrUtil.format(pathUrl + "/对账单_{}", new Date().getTime()); + // 压缩到的位置 + File zipFile = new File(zipFileName + ".zip"); + ZipUtil.zip(zipFile, false, files.toArray(new File[files.size()])); + + // 设置响应类型 + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8")); + + // 输出PDF到响应输出流 + // 将文件内容写入响应流 + try (InputStream inputStream = new FileInputStream(zipFile)) { + IoUtil.copy(inputStream, response.getOutputStream()); + } catch (IOException e) { + // 异常处理 + log.info("导出对账单写入流失败,{}", e.getMessage()); + } + // 导出完删除 + delFiles.add(zipFileName); + for (String delFile : delFiles) { + FileUtil.del(delFile); + } + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountCustomExcelVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountCustomExcelVO.java new file mode 100644 index 0000000..7ba44f2 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountCustomExcelVO.java @@ -0,0 +1,84 @@ +package cn.hangtag.module.oms.controller.admin.statementaccount.vo; + +import cn.hangtag.module.oms.controller.admin.customer.vo.CustomerRespVO; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 对账单 Response VO") +@Data +public class StatementAccountCustomExcelVO { + + /** + * 下单日期 + */ + @Schema(description = "下单日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String saleorderDate; + + @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String saleorderNo; + /** + * 联系人 + */ + @Schema(description = "联系人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String contact; + + /** + * 送货日期 + */ + @Schema(description = "送货日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String deliveryDate; + + /** + * 单据编号 + */ + @Schema(description = "单据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String billno; + + /** + * 合约编号 + */ + @Schema(description = "合约编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String saleContractNo; + /** + * 产品编号 + */ + @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String materialCode; + + /** + * 客户编号 + */ + @Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String customerNo; + + /** + * 单位 + */ + @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String unit; + + /** + * 数量 + */ + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private Integer qty; + + + /** + * 单价 + */ + @Schema(description = "单价", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private BigDecimal price; + + /** + * 金额 + */ + @Schema(description = "金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private BigDecimal amount; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountPageReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountPageReqVO.java new file mode 100644 index 0000000..8ad4458 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountPageReqVO.java @@ -0,0 +1,33 @@ +package cn.hangtag.module.oms.controller.admin.statementaccount.vo; + +import cn.hangtag.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.hangtag.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 对账单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class StatementAccountPageReqVO extends PageParam { + + @Schema(description = "单据编号", example = "1808") + private String billno; + + @Schema(description = "日期月份") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] date; + + @Schema(description = "客户", example = "1808") + private Long customerId; + + @Schema(description = "客户名称", example = "1808") + private String customerName; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountRespVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountRespVO.java new file mode 100644 index 0000000..037dd03 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountRespVO.java @@ -0,0 +1,46 @@ +package cn.hangtag.module.oms.controller.admin.statementaccount.vo; + +import cn.hangtag.module.oms.controller.admin.customer.vo.CustomerRespVO; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 对账单 Response VO") +@Data +@ExcelIgnoreUnannotated +public class StatementAccountRespVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6675") + private Long id; + + /** + * 单据编号 + */ + @Schema(description = "单据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String billno; + + @Schema(description = "日期月份", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("日期月份") + private LocalDateTime date; + + @Schema(description = "客户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private Long customerId; + + + private String customerNumber; + + private String customerName; + + @Schema(description = "客户") + private CustomerRespVO customer; + + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountSaveReqVO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountSaveReqVO.java new file mode 100644 index 0000000..5a875be --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/controller/admin/statementaccount/vo/StatementAccountSaveReqVO.java @@ -0,0 +1,34 @@ +package cn.hangtag.module.oms.controller.admin.statementaccount.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountEntryDO; + +@Schema(description = "管理后台 - 对账单新增/修改 Request VO") +@Data +public class StatementAccountSaveReqVO { + + @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21486") + @ExcelProperty("ID") + private Long id; + + @Schema(description = "单据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + private String billno; + + @Schema(description = "日期月份", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "日期月份不能为空") + private LocalDateTime date; + + @Schema(description = "客户", requiredMode = Schema.RequiredMode.REQUIRED, example = "1808") + @NotNull(message = "客户不能为空") + private Long customerId; + + @Schema(description = "对账单明细列表") + private List statementAccountEntrys; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/convert/deliveryrder/DeliveryOrderConvert.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/convert/deliveryrder/DeliveryOrderConvert.java new file mode 100644 index 0000000..4189e0b --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/convert/deliveryrder/DeliveryOrderConvert.java @@ -0,0 +1,33 @@ +package cn.hangtag.module.oms.convert.deliveryrder; + +import cn.hangtag.framework.common.util.collection.CollectionUtils; +import cn.hangtag.framework.common.util.object.BeanUtils; +import cn.hangtag.module.oms.controller.admin.customer.vo.CustomerRespVO; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.DeliveryOrderRespVO; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface DeliveryOrderConvert { + + DeliveryOrderConvert INSTANCE = Mappers.getMapper(DeliveryOrderConvert.class); + + CustomerRespVO convert(CustomerDO bean); + + default List convertList(List list, Map customerMap) { + return CollectionUtils.convertList(list, user -> convert(user, customerMap.get(user.getCustomerId()))); + } + default DeliveryOrderRespVO convert(DeliveryOrderDO user, CustomerDO customer) { + DeliveryOrderRespVO userVO = BeanUtils.toBean(user, DeliveryOrderRespVO.class); + if (customer != null) { + userVO.setCustomer(convert(customer)); + } + return userVO; + } + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/convert/statementaccount/StatementAccountConvert.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/convert/statementaccount/StatementAccountConvert.java new file mode 100644 index 0000000..90a02ce --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/convert/statementaccount/StatementAccountConvert.java @@ -0,0 +1,33 @@ +package cn.hangtag.module.oms.convert.statementaccount; + +import cn.hangtag.framework.common.util.collection.CollectionUtils; +import cn.hangtag.framework.common.util.object.BeanUtils; +import cn.hangtag.module.oms.controller.admin.customer.vo.CustomerRespVO; +import cn.hangtag.module.oms.controller.admin.statementaccount.vo.StatementAccountRespVO; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface StatementAccountConvert { + + StatementAccountConvert INSTANCE = Mappers.getMapper(StatementAccountConvert.class); + + CustomerRespVO convert(CustomerDO bean); + + default List convertList(List list, Map customerMap) { + return CollectionUtils.convertList(list, user -> convert(user, customerMap.get(user.getCustomerId()))); + } + default StatementAccountRespVO convert(StatementAccountDO user, CustomerDO customer) { + StatementAccountRespVO userVO = BeanUtils.toBean(user, StatementAccountRespVO.class); + if (customer != null) { + userVO.setCustomer(convert(customer)); + } + return userVO; + } + +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/deliveryorder/DeliveryOrderDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/deliveryorder/DeliveryOrderDO.java new file mode 100644 index 0000000..d66daf3 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/deliveryorder/DeliveryOrderDO.java @@ -0,0 +1,103 @@ +package cn.hangtag.module.oms.dal.dataobject.deliveryorder; + +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 送货单 DO + * + * @author 王文斌 + */ +@TableName("oms_delivery_order") +@KeySequence("oms_delivery_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeliveryOrderDO extends BaseDO { + + /** + * 单据编号 + */ + private String billno; + /** + * 销售订单号 + */ + private String saleorderNo; + /** + * 日期 + */ + private LocalDateTime date; + /** + * 收货地址 + */ + private String address; + /** + * 物流公司 + */ + private String logisticsCompany; + /** + * 物流编码 + */ + private String logisticsCode; + /** + * 联系人 + */ + private String contact; + /** + * 联系人手机号 + */ + private String phone; + /** + * 电话 + */ + private String tel; + /** + * 总数量 + */ + private Integer totalQty; + /** + * 总金额 + */ + private BigDecimal totalAmount; + /** + * ID + */ + @TableId + private Long id; + /** + * 销售订单ID + */ + private Long saleorderId; + + /** + * 订单日期 + */ + private LocalDateTime saleorderDate; + + /** + * 客户ID数组 + */ + private Long customerId; + /** + * 业务员id + */ + private String salesPersonIds; + /** + * 客户采购编号 + */ + private String customerPurNo; + /** + * 销售合约号 + */ + private String saleContractNo; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/deliveryorder/DeliveryOrderEntryDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/deliveryorder/DeliveryOrderEntryDO.java new file mode 100644 index 0000000..53dd795 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/deliveryorder/DeliveryOrderEntryDO.java @@ -0,0 +1,74 @@ +package cn.hangtag.module.oms.dal.dataobject.deliveryorder; + +import lombok.*; + +import java.math.BigDecimal; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; + +/** + * 送货单明细 DO + * + * @author 管理员 + */ +@TableName("oms_delivery_order_entry") +@KeySequence("oms_delivery_order_entry_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DeliveryOrderEntryDO extends BaseDO { + /** + * ID + */ + @TableId + private Long id; + /** + * 物料编码 + */ + private String materialNumber; + /** + * 物料名称 + */ + private String materialName; + /** + * 物料规格 + */ + private String materialSpec; + /** + * 数量 + */ + private Integer qty; + /** + * 单价 + */ + private BigDecimal price; + + /** + * 币别 + */ + private String currency; + + /** + * 主表ID + */ + private Long parentId; + /** + * 销售订单分录ID + */ + private Long saleorderentryId; + /** + * 物料ID + */ + private Long materialId; + /** + * 单位 + */ + private String unit; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/statementaccount/StatementAccountDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/statementaccount/StatementAccountDO.java new file mode 100644 index 0000000..5871024 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/statementaccount/StatementAccountDO.java @@ -0,0 +1,46 @@ +package cn.hangtag.module.oms.dal.dataobject.statementaccount; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; + +/** + * 对账单 DO + * + * @author wwb + */ +@TableName("oms_statement_account") +@KeySequence("oms_statement_account_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StatementAccountDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + + /** + * 单据编号 + */ + private String billno; + + /** + * 日期月份 + */ + private LocalDateTime date; + /** + * 客户 + */ + private Long customerId; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/statementaccount/StatementAccountEntryDO.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/statementaccount/StatementAccountEntryDO.java new file mode 100644 index 0000000..119331f --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/dataobject/statementaccount/StatementAccountEntryDO.java @@ -0,0 +1,93 @@ +package cn.hangtag.module.oms.dal.dataobject.statementaccount; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.math.BigDecimal; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; + +/** + * 对账单明细 DO + * + * @author wwb + */ +@TableName("oms_statement_account_entry") +@KeySequence("oms_statement_account_entry_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class StatementAccountEntryDO extends BaseDO { + + /** + * ID + */ + @TableId + private Long id; + /** + * 销售编号 + */ + private String saleContractNo; + /** + * 下单日期 + */ + private LocalDateTime orderDate; + /** + * 送货单编号 + */ + private String deliveryNo; + /** + * 送货日期 + */ + private LocalDateTime deliveryDate; + /** + * 产品ID + */ + private Long materialId; + + /** + * 产品编号 + */ + private String materialCode; + /** + * 产品名称 + */ + private String materialName; + + /** + * 币别 + */ + private String currency; + /** + * 数量 + */ + private Integer qty; + /** + * 单价 + */ + private BigDecimal price; + /** + * 金额 + */ + private BigDecimal amount; + /** + * 单位 + */ + private String unit; + /** + * 联系人 + */ + private String contact; + /** + * 主表ID + */ + private Long parentId; + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/deliveryorder/DeliveryOrderEntryMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/deliveryorder/DeliveryOrderEntryMapper.java new file mode 100644 index 0000000..5c5593c --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/deliveryorder/DeliveryOrderEntryMapper.java @@ -0,0 +1,28 @@ +package cn.hangtag.module.oms.dal.mysql.deliveryorder; + +import java.util.*; + +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; +import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderEntryDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 送货单明细 Mapper + * + * @author 管理员 + */ +@Mapper +public interface DeliveryOrderEntryMapper extends BaseMapperX { + + default List selectListByParentId(Long parentId) { + return selectList(DeliveryOrderEntryDO::getParentId, parentId); + } + + default int deleteByParentId(Long parentId) { + return delete(DeliveryOrderEntryDO::getParentId, parentId); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/deliveryorder/DeliveryOrderMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/deliveryorder/DeliveryOrderMapper.java new file mode 100644 index 0000000..52f9a08 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/deliveryorder/DeliveryOrderMapper.java @@ -0,0 +1,40 @@ +package cn.hangtag.module.oms.dal.mysql.deliveryorder; + +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; +import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.DeliveryOrderPageReqVO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderDO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 送货单 Mapper + * + * @author 王文斌 + */ +@Mapper +public interface DeliveryOrderMapper extends BaseMapperX { + + default PageResult selectPage(DeliveryOrderPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(DeliveryOrderDO::getBillno, reqVO.getBillno()) + .eqIfPresent(DeliveryOrderDO::getSaleorderNo, reqVO.getSaleorderNo()) + .betweenIfPresent(DeliveryOrderDO::getDate, reqVO.getDate()) + .eqIfPresent(DeliveryOrderDO::getLogisticsCode, reqVO.getLogisticsCode()) + .eqIfPresent(DeliveryOrderDO::getContact, reqVO.getContact()) + .eqIfPresent(DeliveryOrderDO::getPhone, reqVO.getPhone()) + .eqIfPresent(DeliveryOrderDO::getSaleorderId, reqVO.getSaleorderId()) + .eqIfPresent(DeliveryOrderDO::getCustomerId, reqVO.getCustomerId()) + .eqIfPresent(DeliveryOrderDO::getSalesPersonIds, reqVO.getSalesPersonIds()) + .eqIfPresent(DeliveryOrderDO::getCustomerPurNo, reqVO.getCustomerPurNo()) + .eqIfPresent(DeliveryOrderDO::getSaleContractNo, reqVO.getSaleContractNo()) + .betweenIfPresent(DeliveryOrderDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(DeliveryOrderDO::getId)); + } + + + IPage selectPageV2(IPage page, @Param("reqVO") DeliveryOrderPageReqVO reqVO); + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/saleorder/SaleOrderMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/saleorder/SaleOrderMapper.java index 17c27db..464563c 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/saleorder/SaleOrderMapper.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/saleorder/SaleOrderMapper.java @@ -105,6 +105,16 @@ public interface SaleOrderMapper extends BaseMapperX { */ int updateSumQtyOrAmount(List ids); + /** + * 更新下推发货单全部后更新销售订单已完成状态 + * @param ids + * @return + */ + int updateDeliveryOrderYWCStatus(List ids); + long querySumTotalQty(@Param("reqVO") SaleOrderPageReqVO reqVO); + + + } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/statementaccount/StatementAccountEntryMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/statementaccount/StatementAccountEntryMapper.java new file mode 100644 index 0000000..42eca8b --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/statementaccount/StatementAccountEntryMapper.java @@ -0,0 +1,25 @@ +package cn.hangtag.module.oms.dal.mysql.statementaccount; + +import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountEntryDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 对账单明细 Mapper + * + * @author wwb + */ +@Mapper +public interface StatementAccountEntryMapper extends BaseMapperX { + + default List selectListByParentId(Long parentId) { + return selectList(StatementAccountEntryDO::getParentId, parentId); + } + + default int deleteByParentId(Long parentId) { + return delete(StatementAccountEntryDO::getParentId, parentId); + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/statementaccount/StatementAccountMapper.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/statementaccount/StatementAccountMapper.java new file mode 100644 index 0000000..793827e --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/dal/mysql/statementaccount/StatementAccountMapper.java @@ -0,0 +1,29 @@ +package cn.hangtag.module.oms.dal.mysql.statementaccount; + +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.mybatis.core.mapper.BaseMapperX; +import cn.hangtag.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.hangtag.module.oms.controller.admin.statementaccount.vo.StatementAccountPageReqVO; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountDO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 对账单 Mapper + * + * @author wwb + */ +@Mapper +public interface StatementAccountMapper extends BaseMapperX { + + default PageResult selectPage(StatementAccountPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(StatementAccountDO::getDate, reqVO.getDate()) + .eqIfPresent(StatementAccountDO::getCustomerId, reqVO.getCustomerId()) + .orderByDesc(StatementAccountDO::getId)); + } + + IPage selectPageV2(IPage page, @Param("reqVO") StatementAccountPageReqVO reqVO); + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/job/StatementActJob.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/job/StatementActJob.java new file mode 100644 index 0000000..3d50f81 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/job/StatementActJob.java @@ -0,0 +1,28 @@ +package cn.hangtag.module.oms.job; + +import cn.hangtag.framework.quartz.core.handler.JobHandler; +import cn.hangtag.framework.tenant.core.aop.TenantIgnore; +import cn.hangtag.framework.tenant.core.job.TenantJob; +import cn.hangtag.module.oms.service.statementaccount.StatementAccountService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 对账单生成Job + */ +@Component +@Slf4j +public class StatementActJob implements JobHandler { + + @Resource + private StatementAccountService statementAccountService; + + @Override + @TenantJob + public String execute(String param) throws Exception { + statementAccountService.generateStatementAccountData(); + return null; + } +} diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/deliveryorder/DeliveryOrderService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/deliveryorder/DeliveryOrderService.java new file mode 100644 index 0000000..bbf16b6 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/deliveryorder/DeliveryOrderService.java @@ -0,0 +1,80 @@ +package cn.hangtag.module.oms.service.deliveryorder; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.*; +import javax.servlet.http.HttpServletResponse; +import javax.validation.*; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.*; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderEntryDO; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; + +/** + * 送货单 Service 接口 + * + * @author 王文斌 + */ +public interface DeliveryOrderService { + + /** + * 创建送货单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDeliveryOrder(@Valid DeliveryOrderSaveReqVO createReqVO); + + /** + * 更新送货单 + * + * @param updateReqVO 更新信息 + */ + void updateDeliveryOrder(@Valid DeliveryOrderSaveReqVO updateReqVO); + + /** + * 删除送货单 + * + * @param id 编号 + */ + void deleteDeliveryOrder(Long id); + + /** + * 获得送货单 + * + * @param id 编号 + * @return 送货单 + */ + DeliveryOrderDO getDeliveryOrder(Long id); + + /** + * 获得送货单分页 + * + * @param pageReqVO 分页查询 + * @return 送货单分页 + */ + PageResult getDeliveryOrderPage(DeliveryOrderPageReqVO pageReqVO); + + // ==================== 子表(送货单明细) ==================== + + /** + * 获得送货单明细列表 + * + * @param parentId 主表ID + * @return 送货单明细列表 + */ + List getDeliveryOrderEntryListByParentId(Long parentId); + + + /** + * 获取送货单编码 + * @return + */ + String getNewDeliveryOrderCode(); + + + boolean verifySaleOrderEntryIdIsRepeat(List saleOrderEntrys); + + void generatePdf(HttpServletResponse response, List ids) throws IOException; +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/deliveryorder/DeliveryOrderServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/deliveryorder/DeliveryOrderServiceImpl.java new file mode 100644 index 0000000..559ac12 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/deliveryorder/DeliveryOrderServiceImpl.java @@ -0,0 +1,387 @@ +package cn.hangtag.module.oms.service.deliveryorder; + +import cn.hangtag.framework.common.exception.ServiceException; +import cn.hangtag.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.util.FuncUtil; +import cn.hangtag.framework.common.util.object.BeanUtils; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; +import cn.hangtag.module.oms.common.utils.WKHtmlToPdfUtil; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.DeliveryOrderPageReqVO; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.DeliveryOrderSaveReqVO; +import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderEntryDO; +import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; +import cn.hangtag.module.oms.dal.dataobject.saleorder.SaleOrderDO; +import cn.hangtag.module.oms.dal.mysql.deliveryorder.DeliveryOrderEntryMapper; +import cn.hangtag.module.oms.dal.mysql.deliveryorder.DeliveryOrderMapper; +import cn.hangtag.module.oms.dal.mysql.productinfo.ProductInfoMapper; +import cn.hangtag.module.oms.serialnumber.CodingRulesUtils; +import cn.hangtag.module.oms.service.customer.CustomerService; +import cn.hangtag.module.oms.service.productinfo.ProductInfoService; +import cn.hangtag.module.system.dal.dataobject.user.AdminUserDO; +import cn.hangtag.module.system.service.user.AdminUserService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.*; + +import static cn.hangtag.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.hangtag.module.oms.enums.ErrorCodeConstants.DELIVERY_ORDER_NOT_EXISTS; + +/** + * 送货单 Service 实现类 + * + * @author 王文斌 + */ +@Service +@Validated +@Slf4j +public class DeliveryOrderServiceImpl implements DeliveryOrderService { + + @Resource + private DeliveryOrderMapper deliveryOrderMapper; + @Resource + private DeliveryOrderEntryMapper deliveryOrderEntryMapper; + @Resource + private CustomerService customerService; + @Resource + private ProductInfoMapper productInfoMapper; + @Resource + private ProductInfoService productInfoService; + @Resource + private TemplateEngine templateEngine; + @Resource + private AdminUserService adminUserService; + + @Value("${oms.partyb}") + private String partyb; + + @Value("${oms.partybAddress}") + private String partybAddress; + + @Value("${pdfPath}") + private String pdfPath; + + @Value("${wkappurl}") + private String wkappUrl; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDeliveryOrder(DeliveryOrderSaveReqVO createReqVO) { + // 插入 + DeliveryOrderDO deliveryOrder = BeanUtils.toBean(createReqVO, DeliveryOrderDO.class); + deliveryOrderMapper.insert(deliveryOrder); + + // 插入子表 + createDeliveryOrderEntryList(deliveryOrder.getId(), createReqVO.getDeliveryOrderEntrys()); + // 返回 + return deliveryOrder.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateDeliveryOrder(DeliveryOrderSaveReqVO updateReqVO) { + // 校验存在 + validateDeliveryOrderExists(updateReqVO.getId()); + // 更新 + DeliveryOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliveryOrderDO.class); + deliveryOrderMapper.updateById(updateObj); + + // 更新子表 + updateDeliveryOrderEntryList(updateReqVO.getId(), updateReqVO.getDeliveryOrderEntrys()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteDeliveryOrder(Long id) { + // 校验存在 + validateDeliveryOrderExists(id); + // 删除 + deliveryOrderMapper.deleteById(id); + + // 删除子表 + deleteDeliveryOrderEntryByParentId(id); + } + + private void validateDeliveryOrderExists(Long id) { + if (deliveryOrderMapper.selectById(id) == null) { + throw exception(DELIVERY_ORDER_NOT_EXISTS); + } + } + + @Override + public DeliveryOrderDO getDeliveryOrder(Long id) { + return deliveryOrderMapper.selectById(id); + } + + @Override + public PageResult getDeliveryOrderPage(DeliveryOrderPageReqVO pageReqVO) { + IPage page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + deliveryOrderMapper.selectPageV2(page,pageReqVO); + PageResult saleOrderDOPageResult = new PageResult<>(page.getRecords(), page.getTotal()); + return saleOrderDOPageResult; + } + + // ==================== 子表(送货单明细) ==================== + + @Override + public List getDeliveryOrderEntryListByParentId(Long parentId) { + return deliveryOrderEntryMapper.selectListByParentId(parentId); + } + + private void createDeliveryOrderEntryList(Long parentId, List list) { + list.forEach(o -> o.setParentId(parentId)); + deliveryOrderEntryMapper.insertBatch(list); + } + + private void updateDeliveryOrderEntryList(Long parentId, List list) { + deleteDeliveryOrderEntryByParentId(parentId); + list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新 + createDeliveryOrderEntryList(parentId, list); + } + + private void deleteDeliveryOrderEntryByParentId(Long parentId) { + deliveryOrderEntryMapper.deleteByParentId(parentId); + } + + + private static final long deliveryOrderCodeId = 11L; + @Override + public String getNewDeliveryOrderCode() { + String s = ""; + int count = 10; + while (true) { + count--; + try { + s = CodingRulesUtils.generateCode(deliveryOrderCodeId, false); + checkDeliveryOrderCode(null, s); + return s; + } catch (ServiceException e) { + log.warn("重复或者下一个编码"); + if (count < 0) { + log.error("编码获取失败"); + return ""; + } + } + } + } + + @Override + public boolean verifySaleOrderEntryIdIsRepeat(List saleOrderEntrys) { + int i = 1; + for (Long saleOrderEntryId : saleOrderEntrys) { + Long count = deliveryOrderEntryMapper.selectCount(DeliveryOrderEntryDO::getSaleorderentryId, saleOrderEntryId); + if(count>0){ + throw new ServiceException(3500,"第"+i+"行数据已下推送货单"); + } + i++; + } + return false; + } + + @Override + public void generatePdf(HttpServletResponse response, List ids) throws IOException { + List delFiles = new ArrayList<>(); + List files = new ArrayList<>(); + List deliveryOrders = deliveryOrderMapper.selectList(DeliveryOrderDO::getId, ids); + for (DeliveryOrderDO deliveryOrder : deliveryOrders) { + List entrys = getDeliveryOrderEntryListByParentId(deliveryOrder.getId()); + String htmlContent = generateHtmlContent(deliveryOrder, entrys); + + + //docker生成路径 + String pathUrl = System.getProperty("user.dir") + "/pdffile"; + String fileName = StrUtil.format(pathUrl + "/DeliveryOrder_{}", deliveryOrder.getBillno()); + //主宿机生成路径 + String fileName2 = StrUtil.format(pdfPath + "/DeliveryOrder_{}", deliveryOrder.getBillno()); + + String templatePath = fileName + ".html"; + String pdfPath = fileName + ".pdf"; + String templatePath2 = fileName2 + ".html"; + String pdfPath2 = fileName2 + ".pdf"; + FileUtil.writeString(htmlContent, templatePath, "UTF-8"); + + log.info("已生成HTML文件:" + templatePath); + //请求wkapp + JSONObject params = new JSONObject(); + params.put("input_html_path", "file://" + templatePath2); + params.put("output_pdf_path", pdfPath2); + log.info("请求wkapp接口url:" + wkappUrl + "/exehtmltopdf"); + String result = HttpUtil.post(wkappUrl + "/exehtmltopdf", params, 5 * 60 * 1000); + log.info("请求wkapp接口返回结果:" + result); + //WKHtmlToPdfUtil.convert(templatePath, pdfPath); + File file = FileUtil.file(pdfPath); + files.add(file); + delFiles.add(pdfPath); + delFiles.add(templatePath); + } + String pathUrl = System.getProperty("user.dir") + "/pdffile"; + String zipFileName = StrUtil.format(pathUrl + "/DeliveryOrder_{}", new Date().getTime()); + + // 压缩到的位置 + File zipFile = new File(zipFileName + ".zip"); + + ZipUtil.zip(zipFile, false, files.toArray(new File[files.size()])); + + //downloadZip(zipFile,response); + + // 设置响应类型 + //response.setContentType("application/pdf"); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8")); + + // 输出PDF到响应输出流 + // 将文件内容写入响应流 + try (InputStream inputStream = new FileInputStream(zipFile)) { + IoUtil.copy(inputStream, response.getOutputStream()); + } catch (IOException e) { + // 异常处理 + log.info("导出销售合约写入流失败,{}", e.getMessage()); + } + // 导出完删除 + delFiles.add(zipFileName); + for (String delFile : delFiles) { + FileUtil.del(delFile); + } + } + + private String generateHtmlContent(Long deliveryOrderId) { + DeliveryOrderDO deliveryOrder = getDeliveryOrder(deliveryOrderId); + List deliveryOrderEntrys = getDeliveryOrderEntryListByParentId(deliveryOrderId); + Context context = generateHtmlContents(deliveryOrder, deliveryOrderEntrys); + return templateEngine.process("sendorder_pdf_template", context); + } + + private String generateHtmlContent(DeliveryOrderDO deliveryOrder, List deliveryOrderEntrys) { + Context context = generateHtmlContents(deliveryOrder, deliveryOrderEntrys); + return templateEngine.process("sendorder_pdf_template", context); + } + + private Context generateHtmlContents(DeliveryOrderDO deliveryOrder, List deliveryOrderEntrys) { + CustomerDO customer = customerService.getCustomer(deliveryOrder.getCustomerId()); + Context context = new Context(); + context.setVariable("title", "送货单");//标题 + context.setVariable("customerName", customer.getName());//客户名称 + context.setVariable("customerAddress", customer.getCompanyAddress());//客户地址 + context.setVariable("contact", deliveryOrder.getContact() +" / "+deliveryOrder.getPhone());//联系人 + context.setVariable("billno", deliveryOrder.getBillno());//送货单编号 + context.setVariable("bizDate", DateUtil.date(deliveryOrder.getDate()).toString("yyMMdd"));//业务日期 + context.setVariable("customerNo", customer.getNumber());//客户编号 + context.setVariable("tel", deliveryOrder.getTel());//电话 + String salesPersonIds = deliveryOrder.getSalesPersonIds(); + StringBuffer personText = new StringBuffer(); + if(StringUtils.isNotBlank(salesPersonIds)){ + String[] split = salesPersonIds.split(";"); + Long[] userIds = Arrays.stream(split).map(s -> Long.parseLong(s.trim())).toArray(Long[]::new); + List userList = adminUserService.getUserList(Arrays.asList(userIds)); + for (AdminUserDO adminUserDO : userList) { + if(personText.length()==0){ + personText.append(adminUserDO.getUsername()+" / "+adminUserDO.getMobile()); + }else { + personText.append(adminUserDO.getUsername()+" / "+adminUserDO.getMobile()+";"); + } + } + } + context.setVariable("personText", personText.toString());//负责人 + context.setVariable("totalQty", deliveryOrder.getTotalQty());//总数量 + context.setVariable("logisticsCode", deliveryOrder.getLogisticsCode());//物流单号 + context.setVariable("logisticsCompany", deliveryOrder.getLogisticsCompany());//物流公司 + + List> list = new ArrayList<>(); + for (int i = 0; i < deliveryOrderEntrys.size(); i++) { + DeliveryOrderEntryDO deliveryOrderEntry = deliveryOrderEntrys.get(i); + ProductInfoDO productInfo = productInfoService.getProductInfo(deliveryOrderEntry.getMaterialId()); + //产品信息 + String code = productInfo.getCode(); + String name = productInfo.getName(); + String details = productInfo.getDetails(); + Double specSizeHeight = productInfo.getSpecSizeHeight(); + Double specSizeWidth = productInfo.getSpecSizeWidth(); + Double specSizeThk = productInfo.getSpecSizeThk(); + StringBuilder specBuilder = new StringBuilder(); + + // 处理宽度 + Double width = FuncUtil.toDouble(specSizeWidth, 0d); + if (width > 0) { + specBuilder.append(width); + } + Double height = FuncUtil.toDouble(specSizeHeight, 0d); + if ( height > 0) { + if (specBuilder.length() > 0) { + specBuilder.append(" * "); + } + specBuilder.append(height); + } + Double thickness = FuncUtil.toDouble(specSizeThk, 0d); + if (thickness > 0) { + if (specBuilder.length() > 0) { + specBuilder.append(" "); + } + specBuilder.append(thickness); + } + String spec = specBuilder.toString(); + int j = i + 1; + + Map items = new LinkedHashMap<>(); + items.put("productDesc1", productInfo.getCode()); + items.put("productDesc2", productInfo.getName()); + items.put("productDesc3", deliveryOrder.getSaleContractNo()); + items.put("productDesc4", deliveryOrder.getCustomerPurNo()); + items.put("productDesc5", productInfo.getDetails()); + items.put("qty", deliveryOrderEntry.getQty() +" " +deliveryOrderEntry.getUnit()); + + list.add(items); + } + context.setVariable("items",list); + return context; + } + + + + private void checkDeliveryOrderCode(Long id, String code) { + if (FuncUtil.isNotEmpty(code)) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(DeliveryOrderDO::getId, DeliveryOrderDO::getBillno, BaseDO::getDeleted); + lambdaQueryWrapper.eq(DeliveryOrderDO::getBillno, code); + lambdaQueryWrapper.eq(DeliveryOrderDO::getDeleted, false); + List dos = deliveryOrderMapper.selectList(lambdaQueryWrapper); + if (FuncUtil.isEmpty(id) && FuncUtil.isNotEmpty(dos)) { + throw exception(GlobalErrorCodeConstants.DATA_DUPLICATE); + } + if (FuncUtil.isNotEmpty(id) && FuncUtil.isNotEmpty(dos)) { + for (DeliveryOrderDO aDo : dos) { + // 出现重复并当前id 不一致 + if (!FuncUtil.equals(aDo.getId(), id)) { + throw exception(GlobalErrorCodeConstants.DATA_DUPLICATE); + } + } + } + } + } + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java index 3f677af..34808b4 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderService.java @@ -77,7 +77,8 @@ public interface SaleOrderService { Map getTabsCount(SaleOrderPageReqVO pageReqVO, Long customerId); - void updateSaleOrderBillStatus(List ids, String status); + void updateSaleOrderBillStatus(List ids, String status); + void updateSaleOrderBillStatus(List ids, String status,Map params); void generateProduceOrder(List ids); @@ -169,4 +170,10 @@ public interface SaleOrderService { * @param id */ void exportAttrFile(HttpServletResponse response, Long id); + + /** + * 下推生成送货单 + * @param ids + */ + void updatePushDeliveryOrder(List ids,String logisticsCompany,String logisticsCode); } \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java index e865d8b..1b41e53 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/saleorder/SaleOrderServiceImpl.java @@ -13,6 +13,8 @@ import cn.hangtag.framework.security.core.util.SecurityFrameworkUtils; import cn.hangtag.module.infra.api.file.FileApi; import cn.hangtag.module.oms.common.utils.NumberChineseFormatterUtils; import cn.hangtag.module.oms.controller.admin.common.vo.DataComparisonRespVO; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.DeliveryOrderRespVO; +import cn.hangtag.module.oms.controller.admin.deliveryorder.vo.DeliveryOrderSaveReqVO; import cn.hangtag.module.oms.controller.admin.produceorder.vo.ProduceOrderSaveReqVO; import cn.hangtag.module.oms.controller.admin.product.vo.ProductPriceSaveReqVO; import cn.hangtag.module.oms.controller.admin.salecontract.vo.SaleContractSaveReqVO; @@ -28,6 +30,8 @@ import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderTrendReqVO; import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderTrendRespVO; import cn.hangtag.module.oms.convert.saleorder.SaleOrderConvert; import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderEntryDO; import cn.hangtag.module.oms.dal.dataobject.product.ProductPriceDO; import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO; import cn.hangtag.module.oms.dal.dataobject.salecontract.SaleContractDO; @@ -36,6 +40,8 @@ import cn.hangtag.module.oms.dal.dataobject.saleorder.SaleOrderDO; import cn.hangtag.module.oms.dal.dataobject.saleorderentry.SaleOrderEntryDO; import cn.hangtag.module.oms.dal.dataobject.saleordersku.SaleOrderSkuDO; import cn.hangtag.module.oms.dal.mysql.customer.CustomerMapper; +import cn.hangtag.module.oms.dal.mysql.deliveryorder.DeliveryOrderEntryMapper; +import cn.hangtag.module.oms.dal.mysql.deliveryorder.DeliveryOrderMapper; import cn.hangtag.module.oms.dal.mysql.productinfo.ProductInfoMapper; import cn.hangtag.module.oms.dal.mysql.salecontract.SaleContractMapper; import cn.hangtag.module.oms.dal.mysql.saleorder.SaleOrderMapper; @@ -48,6 +54,7 @@ import cn.hangtag.module.oms.enums.saleorder.SaleOrderStatusEnum; import cn.hangtag.module.oms.enums.saleorder.SaleOrderTypeEnum; import cn.hangtag.module.oms.serialnumber.CodingRulesUtils; import cn.hangtag.module.oms.service.customer.CustomerService; +import cn.hangtag.module.oms.service.deliveryorder.DeliveryOrderService; import cn.hangtag.module.oms.service.produceorder.ProduceOrderService; import cn.hangtag.module.oms.service.product.ProductPriceService; import cn.hangtag.module.oms.service.productinfo.ProductInfoService; @@ -124,7 +131,8 @@ public class SaleOrderServiceImpl implements SaleOrderService { private SaleOrderEntryMapper saleOrderEntryMapper; @Resource private SaleOrderSkuMapper skuOrderSkuMapper; - + @Resource + private DeliveryOrderService deliveryOrderService; @Resource private SaleOrderSkuService saleOrderSkuService; @Resource @@ -1610,6 +1618,76 @@ public class SaleOrderServiceImpl implements SaleOrderService { } } + @Override + public void updatePushDeliveryOrder(List ids,String logisticsCompany,String logisticsCode){ + List saleOrderEntryDOS = saleOrderEntryMapper.selectBatchIds(ids); + + if(saleOrderEntryDOS!=null && !saleOrderEntryDOS.isEmpty()){ + + //验证是否重复下推 + deliveryOrderService.verifySaleOrderEntryIdIsRepeat(ids); + + Long parentId = saleOrderEntryDOS.get(0).getParentId(); + SaleOrderDO saleOrderDO = saleOrderMapper.selectById(parentId); + + if (!StringUtils.equalsAny(saleOrderDO.getBillStatus(), BillStatusEnum.YPLAN.getValue())) { + throw new ServiceException(001, "订单状态未排产,不允许生成送货单!"); + } + + //单据头 + DeliveryOrderSaveReqVO deliveryOrderDO = new DeliveryOrderSaveReqVO(); + deliveryOrderDO.setBillno(deliveryOrderService.getNewDeliveryOrderCode()); + deliveryOrderDO.setSaleorderId(saleOrderDO.getId()); + deliveryOrderDO.setSaleorderNo(saleOrderDO.getBillno()); + deliveryOrderDO.setSaleorderDate(saleOrderDO.getCreateTime()); + deliveryOrderDO.setCustomerId(saleOrderDO.getCustomerId()); + deliveryOrderDO.setPhone(saleOrderDO.getPhone()); + deliveryOrderDO.setContact(saleOrderDO.getContactName()); + deliveryOrderDO.setDate(LocalDateTime.now()); + deliveryOrderDO.setTel(saleOrderDO.getBillno()); + deliveryOrderDO.setSalesPersonIds(saleOrderDO.getOrderFollowerUser()); + deliveryOrderDO.setLogisticsCompany(logisticsCompany); + deliveryOrderDO.setLogisticsCode(logisticsCode); + deliveryOrderDO.setAddress(saleOrderDO.getAddress()); + deliveryOrderDO.setSaleContractNo(saleOrderDO.getSaleContractCode()); + deliveryOrderDO.setCustomerPurNo(saleOrderDO.getContractCode()); + + Integer totalQty = 0; + BigDecimal totalAmt = BigDecimal.ZERO; + List entryLists = new ArrayList<>(); + for (SaleOrderEntryDO saleOrderEntryDO : saleOrderEntryDOS) { + Integer qty = saleOrderEntryDO.getQty(); + BigDecimal amount = saleOrderEntryDO.getAmount(); + totalQty = totalQty+qty; + totalAmt = totalAmt.add(amount); + + DeliveryOrderEntryDO entryDO = new DeliveryOrderEntryDO(); + entryDO.setMaterialId(saleOrderEntryDO.getMaterialId()); + entryDO.setMaterialNumber(saleOrderEntryDO.getMaterialNumber()); + entryDO.setMaterialName(saleOrderEntryDO.getMaterialName()); + entryDO.setMaterialSpec(saleOrderEntryDO.getMaterialSpec()); + entryDO.setPrice(saleOrderEntryDO.getPrice()); + entryDO.setUnit(saleOrderEntryDO.getUnit()); + entryDO.setSaleorderentryId(saleOrderEntryDO.getId()); + entryDO.setCurrency(saleOrderDO.getCurrency()); + entryDO.setParentId(deliveryOrderDO.getId()); + entryDO.setQty(qty); + entryLists.add(entryDO); + } + deliveryOrderDO.setTotalQty(totalQty); + deliveryOrderDO.setTotalAmount(totalAmt); + deliveryOrderDO.setDeliveryOrderEntrys(entryLists); + + deliveryOrderService.createDeliveryOrder(deliveryOrderDO); + + //更新销售订单订单状态 + if (BillStatusEnum.YPLAN.getValue().equals(saleOrderDO.getBillStatus())) { + saleOrderMapper.updateDeliveryOrderYWCStatus(Collections.singletonList(saleOrderDO.getId())); + } + } + } + + /** * 下载ZIP压缩包(会对下载后的压缩包进行删除) * diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/statementaccount/StatementAccountService.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/statementaccount/StatementAccountService.java new file mode 100644 index 0000000..2a9a767 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/statementaccount/StatementAccountService.java @@ -0,0 +1,78 @@ +package cn.hangtag.module.oms.service.statementaccount; + +import java.util.*; +import javax.validation.*; +import cn.hangtag.module.oms.controller.admin.statementaccount.vo.*; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountDO; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountEntryDO; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.pojo.PageParam; + +/** + * 对账单 Service 接口 + * + * @author wwb + */ +public interface StatementAccountService { + + /** + * 创建对账单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createStatementAccount(@Valid StatementAccountSaveReqVO createReqVO); + + /** + * 更新对账单 + * + * @param updateReqVO 更新信息 + */ + void updateStatementAccount(@Valid StatementAccountSaveReqVO updateReqVO); + + /** + * 删除对账单 + * + * @param id 编号 + */ + void deleteStatementAccount(Long id); + + /** + * 获得对账单 + * + * @param id 编号 + * @return 对账单 + */ + StatementAccountDO getStatementAccount(Long id); + + /** + * 获得对账单分页 + * + * @param pageReqVO 分页查询 + * @return 对账单分页 + */ + PageResult getStatementAccountPage(StatementAccountPageReqVO pageReqVO); + + // ==================== 子表(对账单明细) ==================== + + /** + * 获得对账单明细列表 + * + * @param parentId 主表ID + * @return 对账单明细列表 + */ + List getStatementAccountEntryListByParentId(Long parentId); + + + + /** + * 生成单据编码 + * @return + */ + String getNewBillNo(); + + + void generateStatementAccountData(); + + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/statementaccount/StatementAccountServiceImpl.java b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/statementaccount/StatementAccountServiceImpl.java new file mode 100644 index 0000000..59b607b --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/java/cn/hangtag/module/oms/service/statementaccount/StatementAccountServiceImpl.java @@ -0,0 +1,259 @@ +package cn.hangtag.module.oms.service.statementaccount; + +import cn.hangtag.framework.common.exception.ServiceException; +import cn.hangtag.framework.common.exception.enums.GlobalErrorCodeConstants; +import cn.hangtag.framework.common.pojo.PageResult; +import cn.hangtag.framework.common.util.FuncUtil; +import cn.hangtag.framework.common.util.object.BeanUtils; +import cn.hangtag.framework.mybatis.core.dataobject.BaseDO; +import cn.hangtag.module.oms.controller.admin.statementaccount.vo.StatementAccountPageReqVO; +import cn.hangtag.module.oms.controller.admin.statementaccount.vo.StatementAccountSaveReqVO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderDO; +import cn.hangtag.module.oms.dal.dataobject.deliveryorder.DeliveryOrderEntryDO; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountDO; +import cn.hangtag.module.oms.dal.dataobject.statementaccount.StatementAccountEntryDO; +import cn.hangtag.module.oms.dal.mysql.deliveryorder.DeliveryOrderMapper; +import cn.hangtag.module.oms.dal.mysql.statementaccount.StatementAccountEntryMapper; +import cn.hangtag.module.oms.dal.mysql.statementaccount.StatementAccountMapper; +import cn.hangtag.module.oms.serialnumber.CodingRulesUtils; +import cn.hangtag.module.oms.service.deliveryorder.DeliveryOrderService; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static cn.hangtag.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.hangtag.module.oms.enums.ErrorCodeConstants.STATEMENT_ACCOUNT_NOT_EXISTS; + +/** + * 对账单 Service 实现类 + * + * @author wwb + */ +@Service +@Validated +@Slf4j +public class StatementAccountServiceImpl implements StatementAccountService { + + @Resource + private StatementAccountMapper statementAccountMapper; + @Resource + private StatementAccountEntryMapper statementAccountEntryMapper; + @Resource + private DeliveryOrderService deliveryOrderService; + @Resource + private DeliveryOrderMapper deliveryOrderMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createStatementAccount(StatementAccountSaveReqVO createReqVO) { + // 插入 + StatementAccountDO statementAccount = BeanUtils.toBean(createReqVO, StatementAccountDO.class); + statementAccountMapper.insert(statementAccount); + + // 插入子表 + createStatementAccountEntryList(statementAccount.getId(), createReqVO.getStatementAccountEntrys()); + // 返回 + return statementAccount.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateStatementAccount(StatementAccountSaveReqVO updateReqVO) { + // 校验存在 + validateStatementAccountExists(updateReqVO.getId()); + // 更新 + StatementAccountDO updateObj = BeanUtils.toBean(updateReqVO, StatementAccountDO.class); + statementAccountMapper.updateById(updateObj); + + // 更新子表 + updateStatementAccountEntryList(updateReqVO.getId(), updateReqVO.getStatementAccountEntrys()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteStatementAccount(Long id) { + // 校验存在 + validateStatementAccountExists(id); + // 删除 + statementAccountMapper.deleteById(id); + + // 删除子表 + deleteStatementAccountEntryByParentId(id); + } + + private void validateStatementAccountExists(Long id) { + if (statementAccountMapper.selectById(id) == null) { + throw exception(STATEMENT_ACCOUNT_NOT_EXISTS); + } + } + + @Override + public StatementAccountDO getStatementAccount(Long id) { + return statementAccountMapper.selectById(id); + } + + @Override + public PageResult getStatementAccountPage(StatementAccountPageReqVO pageReqVO) { + IPage page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); + statementAccountMapper.selectPageV2(page,pageReqVO); + PageResult saleOrderDOPageResult = new PageResult<>(page.getRecords(), page.getTotal()); + return saleOrderDOPageResult; + } + + // ==================== 子表(对账单明细) ==================== + + @Override + public List getStatementAccountEntryListByParentId(Long parentId) { + return statementAccountEntryMapper.selectListByParentId(parentId); + } + + private static final long billNoRuleId = 11L; + + @Override + public String getNewBillNo() { + String s = ""; + int count = 10; + while (true) { + count--; + try { + s = CodingRulesUtils.generateCode(billNoRuleId, false); + checkBillNoCode(null, s); + return s; + } catch (ServiceException e) { + log.warn("重复或者下一个编码"); + if (count < 0) { + log.error("编码获取失败"); + return ""; + } + } + } + } + + + + private void checkBillNoCode(Long id, String code) { + if (FuncUtil.isNotEmpty(code)) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.select(StatementAccountDO::getId, StatementAccountDO::getBillno, BaseDO::getDeleted); + lambdaQueryWrapper.eq(StatementAccountDO::getBillno, code); + lambdaQueryWrapper.eq(StatementAccountDO::getDeleted, false); + List dos = statementAccountMapper.selectList(lambdaQueryWrapper); + if (FuncUtil.isEmpty(id) && FuncUtil.isNotEmpty(dos)) { + throw exception(GlobalErrorCodeConstants.DATA_DUPLICATE); + } + if (FuncUtil.isNotEmpty(id) && FuncUtil.isNotEmpty(dos)) { + for (StatementAccountDO aDo : dos) { + // 出现重复并当前id 不一致 + if (!FuncUtil.equals(aDo.getId(), id)) { + throw exception(GlobalErrorCodeConstants.DATA_DUPLICATE); + } + } + } + } + } + + private void createStatementAccountEntryList(Long parentId, List list) { + list.forEach(o -> o.setParentId(parentId)); + statementAccountEntryMapper.insertBatch(list); + } + + private void updateStatementAccountEntryList(Long parentId, List list) { + deleteStatementAccountEntryByParentId(parentId); + list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下:1)id 冲突;2)updateTime 不更新 + createStatementAccountEntryList(parentId, list); + } + + private void deleteStatementAccountEntryByParentId(Long parentId) { + statementAccountEntryMapper.deleteByParentId(parentId); + } + + + @Transactional(rollbackFor = Exception.class) + @Override + public void generateStatementAccountData() { + //查询当月数据,按客户分组创建对账单 + LambdaQueryWrapper lambdaQueryWrapperx = new LambdaQueryWrapper<>(); + lambdaQueryWrapperx.between(DeliveryOrderDO::getDate, DateUtil.beginOfMonth(DateUtil.date()),DateUtil.endOfMonth(DateUtil.date())); + List deliveryOrders = deliveryOrderMapper.selectList(lambdaQueryWrapperx); + Map> groupCustomerMap = new HashMap<>(); + + for (DeliveryOrderDO deliveryOrder : deliveryOrders) {//按客户分组 + if(groupCustomerMap.containsKey(deliveryOrder.getCustomerId())){ + List list = groupCustomerMap.get(deliveryOrder.getCustomerId()); + list.add(deliveryOrder); + groupCustomerMap.put(deliveryOrder.getCustomerId(), list); + }else { + groupCustomerMap.put(deliveryOrder.getCustomerId(), Stream.of(deliveryOrder).collect(Collectors.toList())); + } + } + + for (Long customerId : groupCustomerMap.keySet()) { + List deliveryOrders2 = groupCustomerMap.get(customerId); + List listentrys = new ArrayList<>(); + for (DeliveryOrderDO deliveryOrder : deliveryOrders2) { + //创建对账单 + StatementAccountSaveReqVO saveReqVO = new StatementAccountSaveReqVO(); + boolean isAdd = true; + //查询是否存在重复数据 + LambdaQueryWrapper lambdaQueryWrapper2 = new LambdaQueryWrapper<>(); + lambdaQueryWrapper2.eq(StatementAccountDO::getCustomerId,customerId); + lambdaQueryWrapper2.between(StatementAccountDO::getDate, DateUtil.beginOfMonth(DateUtil.date()),DateUtil.endOfMonth(DateUtil.date())); + List statementAccounts2 = statementAccountMapper.selectList(lambdaQueryWrapper2); + if(!statementAccounts2.isEmpty()){ + StatementAccountDO statementAccountDO = statementAccounts2.get(0); + saveReqVO.setId(statementAccountDO.getId()); + saveReqVO.setBillno(statementAccountDO.getBillno()); + saveReqVO.setCustomerId(statementAccountDO.getCustomerId()); + saveReqVO.setDate(statementAccountDO.getDate()); + isAdd = false; + }else { + DateTime date = DateUtil.beginOfMonth(new Date(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli())); + saveReqVO.setBillno(getNewBillNo()); + saveReqVO.setDate(date.toLocalDateTime()); + } + saveReqVO.setCustomerId(deliveryOrder.getCustomerId()); + List deliveryOrderEntrys = deliveryOrderService.getDeliveryOrderEntryListByParentId(deliveryOrder.getId()); + for (DeliveryOrderEntryDO deliveryOrderEntry : deliveryOrderEntrys) { + StatementAccountEntryDO saveEntry = new StatementAccountEntryDO(); + saveEntry.setSaleContractNo(deliveryOrder.getSaleContractNo()); + saveEntry.setOrderDate(deliveryOrder.getSaleorderDate()); + saveEntry.setDeliveryNo(deliveryOrder.getBillno()); + saveEntry.setDeliveryDate(deliveryOrder.getDate()); + saveEntry.setMaterialId(deliveryOrderEntry.getMaterialId()); + saveEntry.setMaterialCode(deliveryOrderEntry.getMaterialNumber()); + saveEntry.setMaterialName(deliveryOrderEntry.getMaterialName()); + saveEntry.setQty(deliveryOrderEntry.getQty()); + saveEntry.setPrice(deliveryOrderEntry.getPrice()); + saveEntry.setCurrency(deliveryOrderEntry.getCurrency()); + saveEntry.setAmount(deliveryOrderEntry.getPrice().multiply(BigDecimal.valueOf(deliveryOrderEntry.getQty())).setScale(2, RoundingMode.HALF_UP)); + saveEntry.setContact(deliveryOrder.getContact()); + saveEntry.setUnit(deliveryOrderEntry.getUnit()); + listentrys.add(saveEntry); + } + saveReqVO.setStatementAccountEntrys(listentrys); + if(!isAdd){ + updateStatementAccount(saveReqVO); + }else { + createStatementAccount(saveReqVO); + } + } + } + } + + +} \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/deliveryorder/DeliveryOrderMapper.xml b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/deliveryorder/DeliveryOrderMapper.xml new file mode 100644 index 0000000..b4193a5 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/deliveryorder/DeliveryOrderMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/saleorder/SaleOrderMapper.xml b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/saleorder/SaleOrderMapper.xml index ebf4118..4c74a1e 100644 --- a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/saleorder/SaleOrderMapper.xml +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/saleorder/SaleOrderMapper.xml @@ -129,4 +129,29 @@ + + UPDATE oms_saleorder um + INNER JOIN ( + SELECT + ud.parent_id master_id, + COUNT(ud.id) as total_up_details, + COUNT(dd.id) as matched_down_details + FROM oms_saleorder_entry ud + LEFT JOIN oms_delivery_order_entry dd ON dd.saleorderentry_id = ud.id + LEFT JOIN oms_delivery_order dm ON dm.saleorder_id = dd.id + AND dm.saleorder_id = ud.parent_id -- 下游主表与上游主表的关联 + WHERE ud.parent_id in + + #{id} + + -- 指定上游主表ID + GROUP BY ud.parent_id + ) stats ON stats.master_id = um.id + SET um.bill_status = 'F',um.order_status = 2 + WHERE stats.total_up_details = stats.matched_down_details + AND um.bill_status = 'E' + AND stats.total_up_details > 0; -- 确保有子表数据 + + + \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/statementaccount/StatementAccountMapper.xml b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/statementaccount/StatementAccountMapper.xml new file mode 100644 index 0000000..422ae32 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/mapper/statementaccount/StatementAccountMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/dzd_excel_templates.xlsx b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/dzd_excel_templates.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1211fde6992d93db6fe6d46fd693e9ec39fe18f5 GIT binary patch literal 11467 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 z z|Mz#V0HVr(%Kz0={QC;|y{-65 + + + + 送货单 + + + + +

东莞嘉晋印刷有限公司

+

地址:东莞市凤岗镇竹尾田村麻埔坳工业区

+

电话:0769-87773701 传真:0769-87505156

+

送货单

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
送货单编号:
日期:
客户:
电话:
负责人:
+ +
+
+ + + + + + + + + + + + + + + + + + +
项目产品说明数量
1 + +
+
+
+
+
CCC
+
+
+
+ +
+ 备注: +
+ +
+
+
+

+ <<<合计:11111 件>>>     +

+

+ 速运公司:11111     + 单号:11111     +

+
+ +
+ + + + + + + + + +
东莞嘉晋印刷有限公司收货方签名盖章
+
+ + + \ No newline at end of file diff --git a/hangtag-ui/hangtag-ui-admin/src/api/oms/deliveryorder/index.ts b/hangtag-ui/hangtag-ui-admin/src/api/oms/deliveryorder/index.ts new file mode 100644 index 0000000..532aa7c --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/api/oms/deliveryorder/index.ts @@ -0,0 +1,69 @@ +import request from '@/config/axios' + +// 送货单 VO +export interface DeliveryOrderVO { + billno: string // 单据编号 + saleorderNo: string // 销售订单号 + date: Date // 日期 + address: string // 收货地址 + logisticsCompany: string // 物流公司 + logisticsCode: string // 物流编码 + contact: string // 联系人 + phone: string // 联系人手机号 + tel: string // 电话 + totalQty: number // 总数量 + totalAmount: number // 总金额 + id: number // ID + saleorderId: number // 销售订单ID + customerId: number // 客户ID数组 + salesPersonIds: string // 业务员id + customerPurNo: string // 客户采购编号 + saleContractNo: string // 销售合约号 +} + +// 送货单 API +export const DeliveryOrderApi = { + // 查询送货单分页 + getDeliveryOrderPage: async (params: any) => { + return await request.get({ url: `/oms/delivery-order/page`, params }) + }, + + // 查询送货单详情 + getDeliveryOrder: async (id: number) => { + return await request.get({ url: `/oms/delivery-order/get?id=` + id }) + }, + + // 新增送货单 + createDeliveryOrder: async (data: DeliveryOrderVO) => { + return await request.post({ url: `/oms/delivery-order/create`, data }) + }, + + // 修改送货单 + updateDeliveryOrder: async (data: DeliveryOrderVO) => { + return await request.put({ url: `/oms/delivery-order/update`, data }) + }, + + // 删除送货单 + deleteDeliveryOrder: async (id: number) => { + return await request.delete({ url: `/oms/delivery-order/delete?id=` + id }) + }, + + // 导出送货单 Excel + exportDeliveryOrder: async (params) => { + return await request.download({ url: `/oms/delivery-order/export-excel`, params }) + }, + +// ==================== 子表(送货单明细) ==================== + + // 获得送货单明细列表 + getDeliveryOrderEntryListByParentId: async (parentId) => { + return await request.get({ url: `/oms/delivery-order/delivery-order-entry/list-by-parent-id?parentId=` + parentId }) + }, + // 导出PIPDF + exportPdf: async (ids: number[]) => { + const params = { + ids: ids.join(',') + } + return await request.download({ url: `/oms/delivery-order/exportPdf`, params}) + } , +} diff --git a/hangtag-ui/hangtag-ui-admin/src/api/oms/saleorder/index.ts b/hangtag-ui/hangtag-ui-admin/src/api/oms/saleorder/index.ts index 1130091..ded331e 100644 --- a/hangtag-ui/hangtag-ui-admin/src/api/oms/saleorder/index.ts +++ b/hangtag-ui/hangtag-ui-admin/src/api/oms/saleorder/index.ts @@ -26,6 +26,12 @@ export interface SaleOrderVO { totalAmount: number // 总金额 } +// 销售订单 VO +export interface SaleOrderEntryVO { + itemKey: number // ID + parentId: number // 主表id +} + // 销售订单 API export const SaleOrderApi = { // 查询销售订单分页 @@ -142,5 +148,11 @@ export const SaleOrderApi = { data: data }) }, - + //生成发货单 + updatePushDeliveryOrder: async (data) => { + return await request.post({ + url: `/oms/sale-order/updatePushDeliveryOrder`, + data: data + }) + } } diff --git a/hangtag-ui/hangtag-ui-admin/src/api/oms/statementaccount/index.ts b/hangtag-ui/hangtag-ui-admin/src/api/oms/statementaccount/index.ts new file mode 100644 index 0000000..10fa2b5 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/api/oms/statementaccount/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' + +// 对账单 VO +export interface StatementAccountVO { + date: Date // 日期月份 + customerId: number // 客户 +} + +// 对账单 API +export const StatementAccountApi = { + // 查询对账单分页 + getStatementAccountPage: async (params: any) => { + return await request.get({ url: `/oms/statement-account/page`, params }) + }, + + // 查询对账单详情 + getStatementAccount: async (id: number) => { + return await request.get({ url: `/oms/statement-account/get?id=` + id }) + }, + + // 新增对账单 + createStatementAccount: async (data: StatementAccountVO) => { + return await request.post({ url: `/oms/statement-account/create`, data }) + }, + + // 修改对账单 + updateStatementAccount: async (data: StatementAccountVO) => { + return await request.put({ url: `/oms/statement-account/update`, data }) + }, + + // 删除对账单 + deleteStatementAccount: async (id: number) => { + return await request.delete({ url: `/oms/statement-account/delete?id=` + id }) + }, + + // 导出对账单 Excel + exportStatementAccount: async (params) => { + return await request.download({ url: `/oms/statement-account/export-excel`, params }) + }, + // 导出对账单 Excel + exportStatementAccount2: async (ids: number[]) => { + const params = { + ids: ids.join(',') + } + return await request.download({ url: `/oms/statement-account/export-excel2`, params }) + }, + + +// ==================== 子表(对账单明细) ==================== + + // 获得对账单明细列表 + getStatementAccountEntryListByParentId: async (parentId) => { + return await request.get({ url: `/oms/statement-account/statement-account-entry/list-by-parent-id?parentId=` + parentId }) + } +} diff --git a/hangtag-ui/hangtag-ui-admin/src/utils/formatTime.ts b/hangtag-ui/hangtag-ui-admin/src/utils/formatTime.ts index 134a986..b747e77 100644 --- a/hangtag-ui/hangtag-ui-admin/src/utils/formatTime.ts +++ b/hangtag-ui/hangtag-ui-admin/src/utils/formatTime.ts @@ -212,6 +212,17 @@ export function dateFormatter2(_row: any, _column: TableColumnCtx, cellValu return cellValue ? formatDate(cellValue, 'YYYY-MM-DD') : '' } +/** + * element plus 的时间 Formatter 实现,使用 YYYY-MM-DD 格式 + * + * @param row 行数据 + * @param column 字段 + * @param cellValue 字段值 + */ +export function dateFormatter3(_row: any, _column: TableColumnCtx, cellValue: any): string { + return cellValue ? formatDate(cellValue, 'YYYYMM') : '' +} + /** * 设置起始日期,时间为00:00:00 * @param param 传入日期 diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/DeliveryOrderForm.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/DeliveryOrderForm.vue new file mode 100644 index 0000000..0af9d18 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/DeliveryOrderForm.vue @@ -0,0 +1,207 @@ + + diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/components/DeliveryOrderEntryForm.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/components/DeliveryOrderEntryForm.vue new file mode 100644 index 0000000..d90e9b2 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/components/DeliveryOrderEntryForm.vue @@ -0,0 +1,126 @@ + + diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/index.vue new file mode 100644 index 0000000..ef4da47 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/deliveryorder/index.vue @@ -0,0 +1,333 @@ + + + diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/detail/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/detail/index.vue index a8384be..5a54573 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/detail/index.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/detail/index.vue @@ -148,7 +148,10 @@ @@ -164,9 +167,10 @@ - + @@ -277,6 +281,28 @@ + + + + + + + + + + + + + + + + + + + @@ -291,7 +317,7 @@ import OrderUpdateAddressForm from '@/views/oms/saleorder/form/OrderUpdateAddres import ProductInfoList from '@/components/ProductInfoList/index.vue' import { useTagsViewStore } from '@/store/modules/tagsView' import { propTypes } from '@/utils/propTypes' -import {SaleOrderApi, SaleOrderVO} from "@/api/oms/saleorder"; +import {SaleOrderApi, SaleOrderEntryVO, SaleOrderVO} from "@/api/oms/saleorder"; defineOptions({ name: 'TradeOrderDetail' }) @@ -328,6 +354,17 @@ const itemFormRules = reactive({ const itemFormEntrysRef = ref() // 表单 Ref +//下推生成发货单参数 +const pushOutBillOpen = ref(false) +const pushOutBillTitle = ref('物流信息') +const pushOutBillform = reactive({ + ids: undefined, + logisticsCompany: undefined, + logisticsCode: undefined +}) + + + const itemFormEntrysRules = reactive({ price: [{ required: true, message: '单价不能为空', trigger: 'blur' }, { validator: validatePrice, trigger: 'change' } // 自定义校验规则 @@ -377,6 +414,58 @@ const addProduct = () => { that.filterParam.brandId = formData.value.brandId productInfoListRef.value.openDialog(that.filterParam) } +// 生成发货单 +const pushDeliveryOrder = async () => { + try { + const entryIds = selectionList.value.map((item) => item.id) + if(Array.isArray(entryIds) && entryIds.length === 0){ + message.error("请选择数据行!"); + return; + } + pushOutBillform.logisticsCompany = undefined + pushOutBillform.logisticsCode = undefined + pushOutBillOpen.value = true + + } catch {} +} + + +/** 下推生成发货单提交按钮 */ +const submitPushOutBillForm = async () => { + const entryIds = selectionList.value.map((item) => item.id) + if(pushOutBillform.logisticsCode != null) { + const data = { + ids:entryIds, + logisticsCompany:pushOutBillform.logisticsCompany, + logisticsCode:pushOutBillform.logisticsCode + } + await SaleOrderApi.updatePushDeliveryOrder(data).then(response => { + debugger; + message.success("生成送货单成功"); + pushOutBillOpen.value = false; + }); + // 刷新列表 + await getDetail() + selectionList.value = selectionList.value.filter((item) => !entryIds.includes(item.id)) + }else { + message.error(`请填写物流信息!`) + } +} + +/** 生成发货单取消按钮 */ +const pushOutBillCancel = () =>{ + pushOutBillOpen.value = false + pushOutBillform.logisticsCompany = undefined + pushOutBillform.logisticsCode = undefined +} + + +/** 选中操作 */ +const selectionList = ref([]) +const handleSelectionChange = (rows) => { + selectionList.value = rows +} + const submit = (data) => { for (let i = 0; i < data.length; i++) { addRow(data[i]) @@ -523,7 +612,7 @@ onMounted(async () => { display: flex; justify-content: space-between; align-items: center; - width: 160px; /* 宽度为父容器的80% */ + width: 280px; /* 宽度为父容器的80% */ padding: 0px; margin: 0 auto; /* 可选,用于水平居中 */ } diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue index 5b7d990..3cd7238 100644 --- a/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/saleorder/index.vue @@ -327,11 +327,11 @@ > 下载附件 - 下推生成出货单 - + --> @@ -788,7 +788,7 @@ const submitPushOutBillForm = async () => { message.error(`请填写物流单号!`) } } -/** 驳回取消按钮 */ +/** 生成发货单取消按钮 */ const pushOutBillCancel = () =>{ pushOutBillOpen.value = false pushOutBillform.logisticsCode = undefined diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/StatementAccountForm.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/StatementAccountForm.vue new file mode 100644 index 0000000..f6f4b7e --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/StatementAccountForm.vue @@ -0,0 +1,129 @@ + + diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/components/StatementAccountEntryForm.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/components/StatementAccountEntryForm.vue new file mode 100644 index 0000000..bfa761d --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/components/StatementAccountEntryForm.vue @@ -0,0 +1,180 @@ + + diff --git a/hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/index.vue b/hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/index.vue new file mode 100644 index 0000000..5c3efe5 --- /dev/null +++ b/hangtag-ui/hangtag-ui-admin/src/views/oms/statementaccount/index.vue @@ -0,0 +1,224 @@ + + +