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 0000000..1211fde Binary files /dev/null and b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/dzd_excel_templates.xlsx differ diff --git a/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/sendorder_pdf_template.html b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/sendorder_pdf_template.html new file mode 100644 index 0000000..499a836 --- /dev/null +++ b/hangtag-module-oms/hangtag-module-oms-biz/src/main/resources/templates/sendorder_pdf_template.html @@ -0,0 +1,292 @@ + + + + + 送货单 + + + + +

东莞嘉晋印刷有限公司

+

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

+

电话: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 @@ + + +