Commit 5985ab5278e5a26db4fddeb0d393ced909e03f62

Authored by chenhang4442024
1 parent 1b7ae743

test测试

Showing 49 changed files with 2005 additions and 62 deletions
src/main/java/com/order/erp/controller/OrderCostController.java
@@ -40,21 +40,48 @@ public class OrderCostController { @@ -40,21 +40,48 @@ public class OrderCostController {
40 queryVO.setProductionDepartment(Collections.singletonList("内部")); 40 queryVO.setProductionDepartment(Collections.singletonList("内部"));
41 return orderCostInfoService.listInnerProfitDetailByPage(queryVO); 41 return orderCostInfoService.listInnerProfitDetailByPage(queryVO);
42 } 42 }
  43 +
43 @PostMapping("/BusinessProfitDetail/listByPage") 44 @PostMapping("/BusinessProfitDetail/listByPage")
44 @ApiOperation("包装费用明细表") 45 @ApiOperation("包装费用明细表")
45 public ServerResult<Page<BusinessProfitDetailVO>> listBusinessProfitDetailsByPage(@RequestBody @Validated OrderBaseInfoQueryVO queryVO) { 46 public ServerResult<Page<BusinessProfitDetailVO>> listBusinessProfitDetailsByPage(@RequestBody @Validated OrderBaseInfoQueryVO queryVO) {
46 return orderCostInfoService.listBusinessProfitDetailByPage(queryVO); 47 return orderCostInfoService.listBusinessProfitDetailByPage(queryVO);
47 } 48 }
  49 +
48 @PostMapping("/edit") 50 @PostMapping("/edit")
49 @ApiOperation("编辑") 51 @ApiOperation("编辑")
50 - public ServerResult edit(@RequestBody OrderCostInfoVO vo) throws Exception { 52 + public ServerResult edit(@RequestBody OrderCostInfoVO vo) throws Exception {
51 return orderCostInfoService.edit(vo); 53 return orderCostInfoService.edit(vo);
52 } 54 }
53 55
54 @PostMapping("/applyEditFileds") 56 @PostMapping("/applyEditFileds")
55 @ApiOperation("申请编辑字段") 57 @ApiOperation("申请编辑字段")
56 - public ServerResult applyEditFileds(@RequestBody OrderCostInfolockFieldVO vo) throws Exception {  
57 - return orderCostInfoService.applyEditFileds(vo); 58 + public ServerResult applyEditFileds(@RequestBody OrderCostInfolockFieldVO vo) {
  59 + return orderCostInfoService.applyEditFileds(vo);
  60 + }
  61 +
  62 + @PostMapping("/businessProfitDetail/exportExcel")
  63 + @ApiOperation("包装费用明细表多个导出")
  64 + public void exportBusinessProfitDetailExcel(HttpServletResponse response, @RequestBody ProjectBaseInfoQueryVO queryVO) throws Exception {
  65 + orderCostInfoService.exportBusinessProfitDetailExcel(response, queryVO);
  66 + }
  67 +
  68 + @PostMapping("/innerProfitDetail/exportExcel")
  69 + @ApiOperation("内部生产费用明细表多个导出")
  70 + public void exportInnerProfitDetailExcel(HttpServletResponse response, @RequestBody ProjectBaseInfoQueryVO queryVO) throws Exception {
  71 + orderCostInfoService.exportInnerProfitDetailExcel(response, queryVO);
  72 + }
  73 +
  74 + @PostMapping("/setPackStatus")
  75 + @ApiOperation("设置包装费用明细表的状态")
  76 + public void setPackStatus(@RequestBody OrderCostInfoVO vo) {
  77 + orderCostInfoService.setPackStatus(vo);
  78 + }
  79 +
  80 +
  81 + @PostMapping("/setInnerStatus")
  82 + @ApiOperation("设置内部生产明细表的状态")
  83 + public void setInnerProduceStatus(@RequestBody OrderCostInfoVO vo) {
  84 + orderCostInfoService.setInnerProduceStatus(vo);
58 } 85 }
59 86
60 } 87 }
src/main/java/com/order/erp/controller/OrderCostDetailedOptLogController.java 0 → 100644
  1 +package com.order.erp.controller;
  2 +
  3 +import com.order.erp.common.constant.ServerResult;
  4 +import com.order.erp.domain.vo.order.OrderCostDetailedOptedLogQueryVO;
  5 +import com.order.erp.service.order.OrderCostDetailedOptLogService;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.web.bind.annotation.PostMapping;
  8 +import org.springframework.web.bind.annotation.RequestBody;
  9 +import org.springframework.web.bind.annotation.RequestMapping;
  10 +import org.springframework.web.bind.annotation.RestController;
  11 +
  12 +/**
  13 + * 净利润分析板块(包装费用明细表/内部生产明细表)--用户操作日志记录
  14 + * */
  15 +@RestController
  16 +@RequestMapping("/orderCostDetailedOptLog")
  17 +public class OrderCostDetailedOptLogController {
  18 + @Autowired
  19 + private OrderCostDetailedOptLogService orderCostDetailedOptLogService;
  20 + @PostMapping("/listByPage")
  21 + public ServerResult listByPage(@RequestBody OrderCostDetailedOptedLogQueryVO queryVO){
  22 + return orderCostDetailedOptLogService.listByPage(queryVO);
  23 + }
  24 +}
src/main/java/com/order/erp/controller/ProjectBaseDevelopOptLogController.java 0 → 100644
  1 +package com.order.erp.controller;
  2 +
  3 +import com.order.erp.common.constant.ServerResult;
  4 +import com.order.erp.domain.vo.order.ProjectOptLogQueryVO;
  5 +
  6 +import com.order.erp.service.order.ProjectBaseDevelopOptLogService;
  7 +import org.springframework.beans.factory.annotation.Autowired;
  8 +import org.springframework.web.bind.annotation.PostMapping;
  9 +import org.springframework.web.bind.annotation.RequestBody;
  10 +import org.springframework.web.bind.annotation.RequestMapping;
  11 +import org.springframework.web.bind.annotation.RestController;
  12 +
  13 +/**
  14 + * 净利润分析板块(业务研发净利润/内部生产净利润)--用户操作日志记录
  15 + * */
  16 +@RestController
  17 +@RequestMapping("/projectOptLog")
  18 +public class ProjectBaseDevelopOptLogController {
  19 + @Autowired
  20 + private ProjectBaseDevelopOptLogService projectBaseDevelopOptLogService;
  21 + /**
  22 + * 分页查询
  23 + * */
  24 + @PostMapping("/listByPage")
  25 + public ServerResult listByPage(@RequestBody ProjectOptLogQueryVO queryVO){
  26 + return projectBaseDevelopOptLogService.listByPage(queryVO);
  27 + }
  28 +
  29 +}
src/main/java/com/order/erp/controller/ProjectController.java
@@ -70,7 +70,7 @@ public class ProjectController { @@ -70,7 +70,7 @@ public class ProjectController {
70 } 70 }
71 71
72 @PostMapping("/businessProfit/export") 72 @PostMapping("/businessProfit/export")
73 - @ApiOperation("业务研发净利润分析表导出") 73 + @ApiOperation("业务研发净利润分析表单个导出")
74 public void exportBusinessProfitInfo(HttpServletResponse response, @RequestParam("projectNoPrefix") String projectNoPrefix) throws Exception { 74 public void exportBusinessProfitInfo(HttpServletResponse response, @RequestParam("projectNoPrefix") String projectNoPrefix) throws Exception {
75 projectBaseInfoService.exportBusinessProfitInfo(response, projectNoPrefix); 75 projectBaseInfoService.exportBusinessProfitInfo(response, projectNoPrefix);
76 } 76 }
@@ -81,4 +81,29 @@ public class ProjectController { @@ -81,4 +81,29 @@ public class ProjectController {
81 projectBaseInfoService.exportInnerProfitInfo(response, projectNoPrefix); 81 projectBaseInfoService.exportInnerProfitInfo(response, projectNoPrefix);
82 } 82 }
83 83
  84 + //直接通过查询传递多个projectNo去查询。
  85 + @PostMapping("/businessProfit/exportExcel")
  86 + @ApiOperation("业务研发净利润分析表多个导出")
  87 + public void exportBusinessProfitExcel(HttpServletResponse response, @RequestBody ProjectBaseInfoQueryVO queryVO) throws Exception {
  88 + projectBaseInfoService.exportBusinessProfitExcel(response, queryVO);
  89 + }
  90 + //直接通过查询传递多个projectNo去查询。
  91 + @PostMapping("/innerProfitInfo/exportExcel")
  92 + @ApiOperation("内部生产净利润分析表多个导出")
  93 + public void exportInnerProfitInfoExcel(HttpServletResponse response, @RequestBody ProjectBaseInfoQueryVO queryVO) throws Exception {
  94 + projectBaseInfoService.exportInnerProfitInfoExcel(response, queryVO);
  95 + }
  96 +
  97 + @PostMapping("/businessProfit/setStatus")
  98 + @ApiOperation("业务研发净利润分析表审核状态设置")
  99 + public void setProjectBaseInfoDevelopmentStatus(@RequestBody OrderBaseInfoVO vo) {
  100 + projectBaseInfoService.setProjectBaseInfoDevelopmentStatus(vo);
  101 + }
  102 + //直接通过查询传递多个projectNo去查询。
  103 + @PostMapping("/innerProfitInfo/setStatus")
  104 + @ApiOperation("内部生产净利润分析表审核状态设置")
  105 + public void setInnerProductionStatus(@RequestBody OrderBaseInfoVO vo) {
  106 + projectBaseInfoService.setInnerProductionStatus(vo);
  107 + }
  108 +
84 } 109 }
src/main/java/com/order/erp/domain/ApplyTypeEnum.java
@@ -24,10 +24,6 @@ public enum ApplyTypeEnum { @@ -24,10 +24,6 @@ public enum ApplyTypeEnum {
24 CHECK_BILL_APPLY(40, "应付账单申请"), 24 CHECK_BILL_APPLY(40, "应付账单申请"),
25 25
26 DEPARTMENT_INVOICE_APPLY(50,"生产科发票申请"), 26 DEPARTMENT_INVOICE_APPLY(50,"生产科发票申请"),
27 -  
28 - ORDER_PACKET_COST_FIELD_EDIT_APPLY(60,"订单包装费用明细字段申请"),  
29 -  
30 - ORDER_PRODUCTION_COST_FIELD_EDIT_APPLY(70,"订单生产费用明细字段申请"),  
31 ; 27 ;
32 private Integer type; 28 private Integer type;
33 29
src/main/java/com/order/erp/domain/OrderCostApplyTpeEnum.java 0 → 100644
  1 +package com.order.erp.domain;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +@Getter
  7 +@AllArgsConstructor
  8 +public enum OrderCostApplyTpeEnum {
  9 +
  10 + ORDER_PACKET_COST_FIELD_EDIT_APPLY(60,"订单包装费用明细字段申请"),
  11 +
  12 + ORDER_PRODUCTION_COST_FIELD_EDIT_APPLY(70,"订单生产费用明细字段申请"),
  13 + ;
  14 +
  15 + private Integer type;
  16 + private String desc;
  17 +
  18 + public static String getNameByType(Integer type) {
  19 + for (OrderCostApplyTpeEnum e : OrderCostApplyTpeEnum.values()) {
  20 + if (e.getType().equals(type)) {
  21 + return e.getDesc();
  22 + }
  23 + }
  24 + return null;
  25 + }
  26 +}
src/main/java/com/order/erp/domain/OrderOptTypeEnum.java
@@ -29,6 +29,21 @@ public enum OrderOptTypeEnum { @@ -29,6 +29,21 @@ public enum OrderOptTypeEnum {
29 29
30 ORDER_INSPECT_EDIT_APPLY(60, "质检信息编辑"), 30 ORDER_INSPECT_EDIT_APPLY(60, "质检信息编辑"),
31 31
  32 + //后续添加部分(净利润分析板块)
  33 + PROJECT_DEVELOPMENT_PROFIT_EDIT(70,"业务研发净利润编辑"),
  34 + PROJECT_DEVELOPMENT_PROFIT_ADD(75,"业务研发净利润创建"),
  35 +// PROJECT_DEVELOPMENT_FIELD_EDIT_APPLY(77,"业务研发净利润字段编辑申请"),
  36 + PROJECT_COST_EDIT(80,"包装费用明细编辑"),
  37 + PROJECT_COST_ADD(85,"包装费用明细创建"),
  38 +// PROJECT_COST_FIELD_EDIT_APPLY(87,"包装费用明细表字段编辑申请"),
  39 + PROJECT_INNER_PRODUCE_EDIT(90,"内部生产净利润编辑"),
  40 + PROJECT_INNER_PRODUCE_ADD(95,"内部生产净利润创建"),
  41 +// PROJECT_INNER_PRODUCE_FIELD_EDIT_APPLY(97,"内部生产净利润字段编辑申请"),
  42 + PROJECT_INNER_PRODUCE_PROFIT_EDIT(100,"内部生产明细表编辑"),
  43 + PROJECT_INNER_PRODUCE_PROFIT_ADD(105,"内部生产明细表创建"),
  44 +// PROJECT_INNER_PRODUCE_PROFIT_FIELD_EDIT_APPLY(107,"内部研发净明细表字段编辑申请"),
  45 +
  46 +
32 ; 47 ;
33 private Integer type; 48 private Integer type;
34 49
src/main/java/com/order/erp/domain/ProfitStatusEnum.java 0 → 100644
  1 +package com.order.erp.domain;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +/**
  6 + * 净利润板块的各个表的状态字段。
  7 + * */
  8 +@Getter
  9 +@AllArgsConstructor
  10 +public enum ProfitStatusEnum {
  11 + Not_COMPLETED(-1, "未完成"),
  12 + PENDING_APPROVAL(0, "待审核"),
  13 + APPROVED(1, "已审核"),
  14 + ;
  15 + private Integer status;
  16 + private String desc;
  17 +}
src/main/java/com/order/erp/domain/ProjectApplyTypeEnum.java
@@ -22,4 +22,12 @@ public enum ProjectApplyTypeEnum { @@ -22,4 +22,12 @@ public enum ProjectApplyTypeEnum {
22 private Integer type; 22 private Integer type;
23 23
24 private String desc; 24 private String desc;
  25 + public static String getDescByName(String type) {
  26 + for (ProjectApplyTypeEnum value : ProjectApplyTypeEnum.values()) {
  27 + if (value.name().equals(type)) {
  28 + return value.getDesc();
  29 + }
  30 + }
  31 + return null;
  32 + }
25 } 33 }
src/main/java/com/order/erp/domain/ProjectBaseSettingTypeEnum.java 0 → 100644
  1 +package com.order.erp.domain;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +@Getter
  7 +@AllArgsConstructor
  8 +public enum ProjectBaseSettingTypeEnum {
  9 + COMMISSION_COST(1, "提成成本配置"),
  10 + FIXED_COST_OF_PRODUCTION_DEPARTMENT(2, "生产科固定成本配置"),
  11 + ;
  12 + private Integer type;
  13 +
  14 + private String desc;
  15 +}
src/main/java/com/order/erp/domain/ProjectOptTypeEnum.java 0 → 100644
  1 +package com.order.erp.domain;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +/**
  6 + * 净利润分析板块下的项目类型枚举
  7 + */
  8 +@Getter
  9 +@AllArgsConstructor
  10 +public enum ProjectOptTypeEnum {
  11 + BUSINESS_NET_PROFIT_TYPE(10, "业务研发净利润类型"),
  12 +
  13 + PACKAGING_COST_TYPE(20, "包装费用类型"),
  14 +
  15 + INTERNAL_BUSINESS_NET_PROFIT_TYPE(30, "内部生产净利润类型"),
  16 +
  17 + INTERNAL_PRODUCE_DETAILS_TYPE(40, "内部生产明细表类型"),
  18 + ;
  19 +
  20 + private Integer type;
  21 +
  22 + private String desc;
  23 +}
src/main/java/com/order/erp/domain/dto/order/OrderCostDetailedOptLogDO.java 0 → 100644
  1 +package com.order.erp.domain.dto.order;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.TableName;
  4 +import com.order.erp.domain.dto.BaseDO;
  5 +import lombok.*;
  6 +import lombok.experimental.SuperBuilder;
  7 +
  8 +import java.io.Serializable;
  9 +
  10 +/**
  11 + * 包装费用,内部生产明细操作日志表(OrderCostDetailedOptLogDO)实体类
  12 + *
  13 + * @author makejava
  14 + * @since 2023-09-08 15:14:46
  15 + */
  16 +@TableName("order_cost_detailed_opt_log")
  17 +@Data
  18 +@AllArgsConstructor
  19 +@ToString
  20 +@NoArgsConstructor
  21 +@EqualsAndHashCode(callSuper = false)
  22 +@SuperBuilder
  23 +public class OrderCostDetailedOptLogDO extends BaseDO implements Serializable {
  24 + private Long id;
  25 + private Long orderId;
  26 + /**
  27 + * 用户id
  28 + */
  29 + private Long userId;
  30 + /**
  31 + * 操作类型
  32 + */
  33 + private Integer type;
  34 +
  35 + /**
  36 + * 操作类型描述
  37 + */
  38 + private String optType;
  39 + /**
  40 + * 操作字段 json字符串
  41 + */
  42 + private String fields;
  43 +}
src/main/java/com/order/erp/domain/dto/order/OrderCostInfoDO.java
@@ -43,6 +43,9 @@ public class OrderCostInfoDO extends BaseDO implements Serializable { @@ -43,6 +43,9 @@ public class OrderCostInfoDO extends BaseDO implements Serializable {
43 private BigDecimal productionActualPrice; 43 private BigDecimal productionActualPrice;
44 44
45 private BigDecimal packetActualRmbTotalPrice; 45 private BigDecimal packetActualRmbTotalPrice;
46 - 46 + //包装费用明细表状态。
  47 + private Integer packStatus;
  48 + //内部生产明细表状态。
  49 + private Integer innerProduceStatus;
47 50
48 } 51 }
src/main/java/com/order/erp/domain/dto/order/ProjectBaseAfterReviewSettingDO.java 0 → 100644
  1 +package com.order.erp.domain.dto.order;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.TableName;
  4 +import lombok.*;
  5 +import lombok.experimental.SuperBuilder;
  6 +
  7 +import java.math.BigDecimal;
  8 +/**
  9 + * 存储,内部业务研发净利润审核通过的配置,以及内部生产净利润审核通过的配置 因为这个配置是每年都会改变,所以需要保存当时审核年份的配置,防止切换到其他年份配置更改之后,之前的数据又会被重新计算。
  10 + * */
  11 +@TableName("project_base_after_review_setting")
  12 +@Data
  13 +@AllArgsConstructor
  14 +@ToString
  15 +@NoArgsConstructor
  16 +@EqualsAndHashCode(callSuper = false)
  17 +@SuperBuilder
  18 +public class ProjectBaseAfterReviewSettingDO {
  19 + private Long id;
  20 + /**
  21 + * 存储项目号,可能存储项目号的前八位(业务研发净利润专属),也可能存储完整的项目号(内部生产净利润)
  22 + * */
  23 + private String projectNoPrefix;
  24 + /**
  25 + * type=1代表为提成成本配置,type=2代表为生产科固定成本配置
  26 + * */
  27 + private Integer type;
  28 +
  29 + /**
  30 + * 审核通过时的配置数据。 --提成成本配置或者生产科固定成本中的固定成本。 type=1代表为提成成本配置,type=2代表为生产科固定成本配置
  31 + * */
  32 + private BigDecimal fixedCost;
  33 + /**
  34 + * 审核通过时的配置数据。 --提成成本配置中的提成比例。
  35 + * */
  36 + private BigDecimal commissionRate;
  37 +
  38 + /**
  39 + * 审核通过时的配置数据。 --提成成本配置中的西班牙提成比例。
  40 + * */
  41 + private BigDecimal spainCommissionRate;
  42 +
  43 + /**
  44 + * 审核通过时的配置数据。 --生产科固定成本配置中的提成单价。
  45 + * */
  46 + private BigDecimal commissionUnitPrice;
  47 +}
src/main/java/com/order/erp/domain/dto/order/ProjectBaseDevelopOptLogDO.java 0 → 100644
  1 +package com.order.erp.domain.dto.order;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.TableName;
  4 +import com.order.erp.domain.dto.BaseDO;
  5 +import lombok.*;
  6 +import lombok.experimental.SuperBuilder;
  7 +
  8 +import java.io.Serializable;
  9 +
  10 +/**
  11 + * 用户业务研发,内部生产操作日志表(ProjectBaseDevelopOptLogDO)实体类
  12 + *
  13 + * @author makejava
  14 + * @since 2023-09-08 15:14:46
  15 + */
  16 +@TableName("project_base_develop_opt_log")
  17 +@Data
  18 +@AllArgsConstructor
  19 +@ToString
  20 +@NoArgsConstructor
  21 +@EqualsAndHashCode(callSuper = false)
  22 +@SuperBuilder
  23 +public class ProjectBaseDevelopOptLogDO extends BaseDO implements Serializable {
  24 + private static final long serialVersionUID = -79481441736960701L;
  25 +
  26 + private Long id;
  27 + /**
  28 + * 项目号前八位前缀 或者前十位前缀
  29 + */
  30 + private String projectNoPrefix;
  31 + /**
  32 + * 用户id
  33 + */
  34 + private Long userId;
  35 + /**
  36 + * 操作类型
  37 + */
  38 + private Integer type;
  39 +
  40 + /**
  41 + * 操作类型描述
  42 + */
  43 + private String optType;
  44 + /**
  45 + * 操作字段 json字符串
  46 + */
  47 + private String fields;
  48 +
  49 +}
src/main/java/com/order/erp/domain/dto/order/ProjectBaseInfoDO.java
@@ -33,24 +33,47 @@ public class ProjectBaseInfoDO extends BaseDO implements Serializable { @@ -33,24 +33,47 @@ public class ProjectBaseInfoDO extends BaseDO implements Serializable {
33 33
34 @TableId(value = "id", type = IdType.AUTO) 34 @TableId(value = "id", type = IdType.AUTO)
35 private Long id; 35 private Long id;
36 - 36 + /**
  37 + * 项目号的前缀 例如:A05-2303-2391,projectNoPrefix就是A05-2303。
  38 + * */
37 private String projectNoPrefix; 39 private String projectNoPrefix;
38 - 40 + /**
  41 + * 研发复制费合计¥
  42 + * */
39 private BigDecimal developmentCopyRmbTotalPrice; 43 private BigDecimal developmentCopyRmbTotalPrice;
40 - 44 + /**
  45 + * 项目开始时间
  46 + * */
41 private LocalDateTime projectStartTime; 47 private LocalDateTime projectStartTime;
42 - 48 + /**
  49 + * 项目结束时间
  50 + * */
43 private LocalDateTime projectEndTime; 51 private LocalDateTime projectEndTime;
44 52
45 private LocalDateTime projectInnerProfitInfoStartTime; 53 private LocalDateTime projectInnerProfitInfoStartTime;
46 54
47 private LocalDateTime projectInnerProfitInfoEndTime; 55 private LocalDateTime projectInnerProfitInfoEndTime;
48 56
49 - 57 + /**
  58 + * 西班牙已发提成
  59 + * */
50 private BigDecimal spainPaidRmbCommission; 60 private BigDecimal spainPaidRmbCommission;
51 - 61 + /**
  62 + * 中国团队已发提成
  63 + * */
52 private BigDecimal paidRmbCommission; 64 private BigDecimal paidRmbCommission;
53 - 65 + /**
  66 + * 实际汇率
  67 + * */
54 private BigDecimal actualExchangeRate; 68 private BigDecimal actualExchangeRate;
55 69
  70 + /**
  71 + * 业务研发净利润分析表审核状态
  72 + * */
  73 + private Integer developmentStatus;
  74 + /**
  75 + * 内部生产净利润分析表审核状态
  76 + * */
  77 + private Integer innerProductionStatus;
  78 +
56 } 79 }
src/main/java/com/order/erp/domain/vo/order/BusinessCostExportSelect.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.*;
  5 +import lombok.experimental.SuperBuilder;
  6 +
  7 +
  8 +
  9 +@Data
  10 +@AllArgsConstructor
  11 +@ToString
  12 +@NoArgsConstructor
  13 +@EqualsAndHashCode(callSuper = false)
  14 +@SuperBuilder
  15 +public class BusinessCostExportSelect {
  16 + /**
  17 + * 包装费用$
  18 + */
  19 + @ApiModelProperty(value = "包装费用(美元)")
  20 + private String packetPrice;
  21 +
  22 + /**
  23 + * 包装费用合计$
  24 + */
  25 + @ApiModelProperty(value = "包装费用合计(美元)")
  26 + private String packetTotalPrice;
  27 +
  28 + /**
  29 + * 包装费用合计¥
  30 + */
  31 + @ApiModelProperty(value = "包装费用合计(人民币)")
  32 + private String packetRmbTotalPrice;
  33 +
  34 + /**
  35 + * 包装费用实际金额
  36 + */
  37 + @ApiModelProperty(value = "包装费用实际金额(人民币)")
  38 + private String packetActualRmbTotalPrice;
  39 +
  40 + /**
  41 + * 实际跟单单价¥
  42 + */
  43 + @ApiModelProperty(value = "实际跟单单价(人民币)")
  44 + private String packetActualRmbPrice;
  45 +
  46 + /**
  47 + * 实际跟单单价$
  48 + */
  49 + @ApiModelProperty(value = "实际跟单单价(美元)")
  50 + private String packetActualPrice;
  51 +
  52 + /**
  53 + * 包装费用收益
  54 + */
  55 + @ApiModelProperty(value = "包装费用收益(人民币)")
  56 + private String packetProfitRmbPrice;
  57 +
  58 + /**
  59 + * 包装费用利润率
  60 + */
  61 + @ApiModelProperty(value = "包装费用利润率")
  62 + private String packetProfitRate;
  63 +
  64 +}
src/main/java/com/order/erp/domain/vo/order/BusinessProfitDetailVO.java
@@ -111,6 +111,11 @@ public class BusinessProfitDetailVO implements Serializable { @@ -111,6 +111,11 @@ public class BusinessProfitDetailVO implements Serializable {
111 */ 111 */
112 @ApiModelProperty(value = "包装费用利润率") 112 @ApiModelProperty(value = "包装费用利润率")
113 private BigDecimal packetProfitRate; 113 private BigDecimal packetProfitRate;
  114 + /**
  115 + * 包装费用明细表状态
  116 + */
  117 + @ApiModelProperty(value = "包装费用明细表状态")
  118 + private Integer packStatus;
114 119
115 /** 120 /**
116 * 锁定字段信息 121 * 锁定字段信息
src/main/java/com/order/erp/domain/vo/order/BusinessProfitInfoVO.java
@@ -7,6 +7,8 @@ import lombok.experimental.SuperBuilder; @@ -7,6 +7,8 @@ import lombok.experimental.SuperBuilder;
7 import java.io.Serializable; 7 import java.io.Serializable;
8 import java.math.BigDecimal; 8 import java.math.BigDecimal;
9 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
  10 +import java.util.List;
  11 +import java.util.Set;
10 12
11 /** 13 /**
12 * 业务/研发净利润分析 14 * 业务/研发净利润分析
@@ -35,6 +37,9 @@ public class BusinessProfitInfoVO implements Serializable { @@ -35,6 +37,9 @@ public class BusinessProfitInfoVO implements Serializable {
35 @ApiModelProperty(value = "项目号") 37 @ApiModelProperty(value = "项目号")
36 private String projectNoPrefix; 38 private String projectNoPrefix;
37 39
  40 + @ApiModelProperty(value = "完整项目号,用于当做id来使用,因为没有返回id所以无法确实操作的是那一条数据,所以需要完整的项目号来确认是哪一条数据")
  41 + private Set<String> detailProjectNo;
  42 +
38 /** 43 /**
39 * 客户总价¥ 44 * 客户总价¥
40 */ 45 */
@@ -233,6 +238,19 @@ public class BusinessProfitInfoVO implements Serializable { @@ -233,6 +238,19 @@ public class BusinessProfitInfoVO implements Serializable {
233 @ApiModelProperty(value = "综合收益") 238 @ApiModelProperty(value = "综合收益")
234 private BigDecimal comprehensiveProfit; 239 private BigDecimal comprehensiveProfit;
235 240
  241 +
  242 + /**
  243 + * 业务研发净利润状态
  244 + */
  245 + @ApiModelProperty(value = "业务研发净利润状态")
  246 + private Integer developmentStatus;
  247 +
  248 + /**
  249 + * 内部生产净利润状态
  250 + */
  251 + @ApiModelProperty(value = "内部生产净利润状态")
  252 + private Integer innerProductionStatus;
  253 +
236 /** 254 /**
237 * 项目开始时间 255 * 项目开始时间
238 */ 256 */
src/main/java/com/order/erp/domain/vo/order/InnerProfitDetailExportSelect.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.*;
  5 +import lombok.experimental.SuperBuilder;
  6 +
  7 +
  8 +@Data
  9 +@AllArgsConstructor
  10 +@ToString
  11 +@NoArgsConstructor
  12 +@EqualsAndHashCode(callSuper = false)
  13 +@SuperBuilder
  14 +public class InnerProfitDetailExportSelect {
  15 + /**
  16 + * 生产科预算金额由财务手动输入
  17 + */
  18 + @ApiModelProperty(value = "生产科预算金额")
  19 + private String productionDepartmentPredictPrice;
  20 +
  21 +
  22 + /**
  23 + * 实际发生费用 手动输入
  24 + */
  25 + @ApiModelProperty(value = "实际发生费用")
  26 + private String productionActualPrice;
  27 +
  28 + /**
  29 + * 生产科总价合计
  30 + */
  31 + @ApiModelProperty(value = "生产科总价")
  32 + private String productionDepartmentTotalPrice;
  33 + /**
  34 + * 生产科总价合计
  35 + */
  36 + @ApiModelProperty(value = "生产科单价")
  37 + private String productionDepartmentPrice;
  38 +
  39 +
  40 + /**
  41 + * 预算占比
  42 + * 预算占比计算(实际发生费用/预算金额
  43 + */
  44 + @ApiModelProperty(value = "预算占比")
  45 + private String predictRatio;
  46 +
  47 + /**
  48 + * 预算占比与实际占比差
  49 + * 预算占比与实际占比差计算(1-预算占比)
  50 + */
  51 + @ApiModelProperty(value = "预算占比与实际占比差")
  52 + private String predictAndActualRatio;
  53 +
  54 + /**
  55 + * 内部生产毛利润计算:生产科总价-预算金额
  56 + */
  57 + @ApiModelProperty(value = "事前毛利润")
  58 + private String beforeGrossProfit;
  59 +
  60 + /**
  61 + * 内部生产毛利润率计算:事前毛利润/生产科总价
  62 + */
  63 + @ApiModelProperty(value = "事前毛利率")
  64 + private String beforeGrossProfitRate;
  65 +
  66 + /**
  67 + * 内部生产毛利润计算:生产科总价-实际发生费用就是得出
  68 + */
  69 + @ApiModelProperty(value = "事后毛利润")
  70 + private String grossProfit;
  71 +
  72 + /**
  73 + * 内部生产毛利润率计算:事后毛利润/生产科总价
  74 + */
  75 + @ApiModelProperty(value = "事后毛利率")
  76 + private String grossProfitRate;
  77 +
  78 +}
src/main/java/com/order/erp/domain/vo/order/InnerProfitDetailVO.java
@@ -64,6 +64,12 @@ public class InnerProfitDetailVO implements Serializable { @@ -64,6 +64,12 @@ public class InnerProfitDetailVO implements Serializable {
64 @ApiModelProperty(value = "生产科预算金额") 64 @ApiModelProperty(value = "生产科预算金额")
65 private BigDecimal productionDepartmentPredictPrice; 65 private BigDecimal productionDepartmentPredictPrice;
66 66
  67 + /**
  68 + * 生产科预算单价,由生产科预算金额/数量。
  69 + */
  70 + @ApiModelProperty(value = "生产科预算金额")
  71 + private BigDecimal productionDepartmentPredictUnitprice;
  72 +
67 73
68 /** 74 /**
69 * 实际发生费用 手动输入 75 * 实际发生费用 手动输入
@@ -120,6 +126,11 @@ public class InnerProfitDetailVO implements Serializable { @@ -120,6 +126,11 @@ public class InnerProfitDetailVO implements Serializable {
120 */ 126 */
121 @ApiModelProperty(value = "事后毛利润") 127 @ApiModelProperty(value = "事后毛利润")
122 private BigDecimal grossProfitRate; 128 private BigDecimal grossProfitRate;
  129 + /**
  130 + * 内部生产明细表状态
  131 + */
  132 + @ApiModelProperty(value = "内部生产明细表状态")
  133 + private Integer innerProduceStatus ;
123 134
124 private OrderCostInfolockFieldVO lockFields; 135 private OrderCostInfolockFieldVO lockFields;
125 136
src/main/java/com/order/erp/domain/vo/order/InnerProfitInfoExportSelect.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.*;
  5 +import lombok.experimental.SuperBuilder;
  6 +
  7 +
  8 +
  9 +@Data
  10 +@AllArgsConstructor
  11 +@ToString
  12 +@NoArgsConstructor
  13 +@EqualsAndHashCode(callSuper = false)
  14 +@SuperBuilder
  15 +public class InnerProfitInfoExportSelect {
  16 +
  17 +
  18 +
  19 + /**
  20 + * 生产科预算金额由财务手动输入
  21 + */
  22 + @ApiModelProperty(value = "生产科预算金额")
  23 + private String productionDepartmentPredictPrice;
  24 +
  25 +
  26 + /**
  27 + * 实际发生费用 手动输入
  28 + */
  29 + @ApiModelProperty(value = "实际发生费用")
  30 + private String productionActualPrice;
  31 +
  32 + /**
  33 + * 生产科总价合计
  34 + */
  35 + @ApiModelProperty(value = "生产科单价")
  36 + private String productionDepartmentUnitPrice;
  37 +
  38 + /**
  39 + * 生产科总价合计
  40 + */
  41 + @ApiModelProperty(value = "生产科总价")
  42 + private String productionDepartmentTotalPrice;
  43 +
  44 +
  45 + /**
  46 + * 预算占比
  47 + * 预算占比计算(实际发生费用/预算金额
  48 + */
  49 + @ApiModelProperty(value = "预算占比")
  50 + private String predictRatio;
  51 +
  52 + /**
  53 + * 预算占比与实际占比差
  54 + * 预算占比与实际占比差计算(1-预算占比)
  55 + */
  56 + @ApiModelProperty(value = "预算占比与实际占比差")
  57 + private String predictAndActualRatio;
  58 +
  59 + /**
  60 + * 内部生产毛利润计算:生产科总价-预算金额
  61 + */
  62 + @ApiModelProperty(value = "事前毛利润")
  63 + private String beforeGrossProfit;
  64 +
  65 + /**
  66 + * 内部生产毛利润率计算:事前毛利润/生产科总价
  67 + */
  68 + @ApiModelProperty(value = "事前毛利率")
  69 + private String beforeGrossProfitRate;
  70 +
  71 + /**
  72 + * 内部生产毛利润计算:生产科总价-实际发生费用就是得出
  73 + */
  74 + @ApiModelProperty(value = "事后毛利润")
  75 + private String grossProfit;
  76 +
  77 + /**
  78 + * 内部生产毛利润率计算:事后毛利润/生产科总价
  79 + */
  80 + @ApiModelProperty(value = "事后毛利率")
  81 + private String grossProfitRate;
  82 +
  83 + /**
  84 + * 内部生产固定成本
  85 + */
  86 + @ApiModelProperty(value = "内部生产固定成本")
  87 + private String innerProductionFixedCost;
  88 +
  89 + /**
  90 + * 内部生产提成
  91 + */
  92 + @ApiModelProperty(value = "内部生产提成")
  93 + private String innerProductionCommission;
  94 + /**
  95 + * 内部生产净利润
  96 + */
  97 + @ApiModelProperty(value = "内部生产净利润")
  98 + private String innerProductionProfit;
  99 + /**
  100 + * 内部生产净利润率
  101 + */
  102 + @ApiModelProperty(value = "内部生产净利润率")
  103 + private String innerProductionProfitRate;
  104 +}
src/main/java/com/order/erp/domain/vo/order/InnerProfitInfoVO.java
@@ -140,6 +140,12 @@ public class InnerProfitInfoVO implements Serializable { @@ -140,6 +140,12 @@ public class InnerProfitInfoVO implements Serializable {
140 @ApiModelProperty(value = "项目结束时间") 140 @ApiModelProperty(value = "项目结束时间")
141 private LocalDateTime produceEndTime; 141 private LocalDateTime produceEndTime;
142 142
  143 + /**
  144 + * 内部生产净利润分析表状态
  145 + */
  146 + @ApiModelProperty(value = "内部生产净利润分析表状态")
  147 + private Integer innerProductionStatus;
  148 +
143 private ProjectBaseInfoLockFieldVO lockFields; 149 private ProjectBaseInfoLockFieldVO lockFields;
144 150
145 } 151 }
src/main/java/com/order/erp/domain/vo/order/OrderCostDetailedOptedLogQueryVO.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import com.order.erp.domain.vo.BasePageVO;
  4 +import lombok.*;
  5 +import lombok.experimental.SuperBuilder;
  6 +
  7 +import java.io.Serializable;
  8 +import java.util.List;
  9 +@Data
  10 +@AllArgsConstructor
  11 +@ToString
  12 +@NoArgsConstructor
  13 +@EqualsAndHashCode(callSuper = false)
  14 +@SuperBuilder
  15 +public class OrderCostDetailedOptedLogQueryVO extends BasePageVO implements Serializable {
  16 +
  17 + private List<Long> ids;
  18 +
  19 + private Long id;
  20 +
  21 + /**
  22 + * 项目号前缀
  23 + * */
  24 + private Long orderId;
  25 +
  26 + /**
  27 + * 业务类型 20:包装费用明细表创建/编辑 40:对应内部生产明细表创建/编辑
  28 + * */
  29 + private Integer type;
  30 +}
src/main/java/com/order/erp/domain/vo/order/OrderCostInfoVO.java
@@ -42,6 +42,13 @@ public class OrderCostInfoVO implements Serializable { @@ -42,6 +42,13 @@ public class OrderCostInfoVO implements Serializable {
42 private BigDecimal productionActualPrice; 42 private BigDecimal productionActualPrice;
43 43
44 private BigDecimal packetActualRmbTotalPrice; 44 private BigDecimal packetActualRmbTotalPrice;
45 - 45 + private Integer orderCount;
  46 + //单价 之前前端是传递productionDepartmentPredictPrice,现在改为传递单价,所以传递productionDepartmentPredictUnitPrice。
  47 + private BigDecimal productionDepartmentPredictUnitPrice;
  48 +
  49 + //内部生产费用明细表状态。
  50 + private Integer innerProduceStatus;
  51 + //包装费用费用明细表状态。
  52 + private Integer packStatus;
46 53
47 } 54 }
src/main/java/com/order/erp/domain/vo/order/OrderCostInfolockFieldVO.java
@@ -40,6 +40,10 @@ public class OrderCostInfolockFieldVO implements Serializable { @@ -40,6 +40,10 @@ public class OrderCostInfolockFieldVO implements Serializable {
40 private String productionActualPrice; 40 private String productionActualPrice;
41 41
42 private String packetActualRmbTotalPrice; 42 private String packetActualRmbTotalPrice;
  43 + /**
  44 + * 生产科预算单价。
  45 + * */
  46 + private String productionDepartmentPredictUnitPrice;
43 47
44 private String applyRemark; 48 private String applyRemark;
45 } 49 }
src/main/java/com/order/erp/domain/vo/order/OrderCostOptLogResultVO.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import lombok.*;
  4 +import lombok.experimental.SuperBuilder;
  5 +
  6 +import java.io.Serializable;
  7 +import java.time.LocalDateTime;
  8 +@Data
  9 +@AllArgsConstructor
  10 +@ToString
  11 +@NoArgsConstructor
  12 +@EqualsAndHashCode(callSuper = false)
  13 +@SuperBuilder
  14 +public class OrderCostOptLogResultVO implements Serializable {
  15 + private Long id;
  16 + /**
  17 + * 订单id
  18 + * */
  19 + private Long orderId;
  20 + /**
  21 + * 用户id
  22 + * */
  23 + private Long userId;
  24 + /**
  25 + * 用户名称
  26 + * */
  27 + private String userName;
  28 + /**
  29 + * 操作类型
  30 + * */
  31 + private String optType;
  32 + /**
  33 + * 操作字段 json字符串
  34 + * */
  35 + private String fields;
  36 +
  37 + private LocalDateTime createTime;
  38 +}
src/main/java/com/order/erp/domain/vo/order/ProjectApplyVO.java
@@ -48,6 +48,9 @@ public class ProjectApplyVO extends BaseDO implements Serializable { @@ -48,6 +48,9 @@ public class ProjectApplyVO extends BaseDO implements Serializable {
48 @ApiModelProperty(value = "审批用户id") 48 @ApiModelProperty(value = "审批用户id")
49 private Long auditUserId; 49 private Long auditUserId;
50 50
  51 + @ApiModelProperty(value = "申请类型")
  52 + private String type;
  53 +
51 @ApiModelProperty(value = "锁定字段 json字符串") 54 @ApiModelProperty(value = "锁定字段 json字符串")
52 private String fields; 55 private String fields;
53 56
src/main/java/com/order/erp/domain/vo/order/ProjectBaseInfoAuditStatus.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import lombok.*;
  4 +import lombok.experimental.SuperBuilder;
  5 +
  6 +@Data
  7 +@AllArgsConstructor
  8 +@ToString
  9 +@NoArgsConstructor
  10 +@EqualsAndHashCode(callSuper = false)
  11 +@SuperBuilder
  12 +public class ProjectBaseInfoAuditStatus {
  13 + /**
  14 + * 设置状态时传递过来的projectNo可能只包含前八位(业务研发净利润分析),或者全部包含(内部生产净利润分析表)。
  15 + * */
  16 + private String projectNo;
  17 +
  18 + /**
  19 + * 类型,用来判断是业务研发净利润分析表还是内部生产净利润分析表
  20 + * */
  21 + private String type;
  22 +
  23 +}
src/main/java/com/order/erp/domain/vo/order/ProjectBaseInfoQueryVO.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import com.order.erp.domain.dto.BaseDO;
  4 +import lombok.*;
  5 +import lombok.experimental.SuperBuilder;
  6 +
  7 +import java.io.Serializable;
  8 +import java.util.List;
  9 +import java.util.Set;
  10 +
  11 +@Data
  12 +@AllArgsConstructor
  13 +@ToString
  14 +@NoArgsConstructor
  15 +@EqualsAndHashCode(callSuper = false)
  16 +@SuperBuilder
  17 +public class ProjectBaseInfoQueryVO extends BaseDO implements Serializable {
  18 + /**
  19 + * 业务研发净利润表以及内部生产明细表,用于条件查询的项目号,需要传递完整的项目号
  20 + * */
  21 + private List<String> detailProjectNo;
  22 +
  23 + /**
  24 + * 包装费用明细表以及内部生产明细表,用于条件查询。
  25 + * */
  26 + private Set<Long> orderIds;
  27 +
  28 + /**
  29 + * 筛选条件 不传orderId时就传递筛选条件 -客户编码。
  30 + * */
  31 + private List<String> customerCode;
  32 +
  33 + /**
  34 + * 筛选条件 不传orderId时就传递筛选条件 -内部编号。
  35 + * */
  36 + private List<String> innerNo;
  37 +
  38 + /**
  39 + * 筛选条件 不传orderId时就传递筛选条件 -生产科。
  40 + * */
  41 + private List<String> productionDepartment;
  42 +
  43 + /**
  44 + * 筛选条件 不传orderId时就传递筛选条件 -项目号。
  45 + * */
  46 + private List<String> projectNo;
  47 +
  48 + /**
  49 + * 业务研发净利润分析选择导出字段
  50 + * */
  51 + private ProjectExportSelect projectExportSelect;
  52 +
  53 + /**
  54 + * 内部研发净利润分析选择导出字段
  55 + * */
  56 + private InnerProfitInfoExportSelect innerProfitInfoExportSelect;
  57 +
  58 + /**
  59 + * 包装费用明细表选择导出字段
  60 + * */
  61 + private BusinessCostExportSelect businessCostExportSelect;
  62 +
  63 + /**
  64 + * 内部生产费用明细表选择导出字段
  65 + * */
  66 + private InnerProfitDetailExportSelect innerProfitDetailExportSelect;
  67 +
  68 +}
src/main/java/com/order/erp/domain/vo/order/ProjectExportSelect.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.*;
  5 +import lombok.experimental.SuperBuilder;
  6 +
  7 +@Data
  8 +@AllArgsConstructor
  9 +@ToString
  10 +@NoArgsConstructor
  11 +@EqualsAndHashCode(callSuper = false)
  12 +@SuperBuilder
  13 +public class ProjectExportSelect {
  14 + /**
  15 + * 客户总价¥
  16 + */
  17 + @ApiModelProperty(value = "客户总价(人民币)")
  18 + private String customerRmbTotalPrice;
  19 +
  20 + /**
  21 + * 客户总价$
  22 + */
  23 + @ApiModelProperty(value = "客户总价")
  24 + private String customerTotalPrice;
  25 +
  26 + /**
  27 + * 生成科总价¥
  28 + */
  29 + @ApiModelProperty(value = "生产部门总价")
  30 + private String productionDepartmentTotalPrice;
  31 +
  32 +
  33 +
  34 + /**
  35 + * 订单数量
  36 + */
  37 + @ApiModelProperty(value = "订单数量")
  38 + private String orderCount;
  39 +
  40 +
  41 + /**
  42 + * 包装费用合计$
  43 + */
  44 + @ApiModelProperty(value = "包装费用合计(美元)")
  45 + private String packetTotalPrice;
  46 +
  47 + /**
  48 + * 包装费用合计¥
  49 + */
  50 + @ApiModelProperty(value = "包装费用合计(人民币)")
  51 + private String packetRmbTotalPrice;
  52 +
  53 +
  54 + /**
  55 + * 包装费用实际金额$
  56 + */
  57 + @ApiModelProperty(value = "包装费用实际金额(人民币)")
  58 + private String packetActualRmbPrice;
  59 +
  60 +
  61 + /**
  62 + * 包装费用收益
  63 + */
  64 + @ApiModelProperty(value = "包装费用收益(人民币)")
  65 + private String packetProfitRmbPrice;
  66 +
  67 +
  68 + /**
  69 + * 研发复制费合计¥
  70 + */
  71 + @ApiModelProperty(value = "研发复制费合计(人民币)")
  72 + private String developmentCopyRmbTotalPrice;
  73 +
  74 + /**
  75 + * 固定成本
  76 + */
  77 + @ApiModelProperty(value = "固定成本")
  78 + private String fixedCost;
  79 +
  80 + /**
  81 + * 西班牙已发提成¥
  82 + */
  83 + @ApiModelProperty(value = "西班牙已发提成(人民币)")
  84 + private String spainPaidRmbCommission;
  85 +
  86 + /**
  87 + * 西班牙提成¥
  88 + */
  89 + @ApiModelProperty(value = "西班牙提成(人民币)")
  90 + private String spainRmbCommission;
  91 +
  92 + /**
  93 + * 西班牙未发提成¥
  94 + */
  95 + @ApiModelProperty(value = "西班牙未发提成(人民币)")
  96 + private String spainUnpaidRmbCommission;
  97 +
  98 + /**
  99 + * 已发提成¥
  100 + */
  101 + @ApiModelProperty(value = "已发提成(人民币)")
  102 + private String paidRmbCommission;
  103 +
  104 + /**
  105 + * 提成¥
  106 + */
  107 + @ApiModelProperty(value = "提成(人民币)")
  108 + private String rmbCommission;
  109 +
  110 + /**
  111 + * 未发提成¥
  112 + */
  113 + @ApiModelProperty(value = "未发提成(人民币)")
  114 + private String unpaidRmbCommission;
  115 +
  116 +
  117 + /**
  118 + * 支出合计
  119 + */
  120 + @ApiModelProperty(value = "支出合计(人民币)")
  121 + private String rmbTotalExpense;
  122 +
  123 + /**
  124 + * 毛利润
  125 + */
  126 + @ApiModelProperty(value = "毛利润")
  127 + private String profit;
  128 +
  129 + /**
  130 + * 毛利率
  131 + */
  132 + @ApiModelProperty(value = "毛利率")
  133 + private String profitRate;
  134 +
  135 + /**
  136 + * 研发净利润
  137 + */
  138 + @ApiModelProperty(value = "研发净利润")
  139 + private String developmentProfit;
  140 +
  141 + /**
  142 + * 净利润率
  143 + */
  144 + @ApiModelProperty(value = "净利润率")
  145 + private String developmentProfitRate;
  146 +
  147 + /**
  148 + * 实际跟单单价
  149 + */
  150 + @ApiModelProperty(value = "实际跟单单价(人民币)")
  151 + private String actualOrderRmbPrice;
  152 +
  153 + /**
  154 + * 实际跟单单价$
  155 + */
  156 + @ApiModelProperty(value = "实际跟单单价(美元)")
  157 + private String actualOrderPrice;
  158 +
  159 +
  160 + /**
  161 + * 综合收益
  162 + */
  163 + @ApiModelProperty(value = "综合收益")
  164 + private String comprehensiveProfit;
  165 +
  166 +}
src/main/java/com/order/erp/domain/vo/order/ProjectOptLogQueryVO.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import com.order.erp.domain.vo.BasePageVO;
  4 +import lombok.*;
  5 +import lombok.experimental.SuperBuilder;
  6 +
  7 +import java.io.Serializable;
  8 +import java.util.List;
  9 +@Data
  10 +@AllArgsConstructor
  11 +@ToString
  12 +@NoArgsConstructor
  13 +@EqualsAndHashCode(callSuper = false)
  14 +@SuperBuilder
  15 +public class ProjectOptLogQueryVO extends BasePageVO implements Serializable {
  16 + private static final long serialVersionUID = 1L;
  17 + private List<Long> ids;
  18 +
  19 + private Long id;
  20 +
  21 + /**
  22 + * 项目号前缀
  23 + * */
  24 + private String projectNoPrefix;
  25 +
  26 + /**
  27 + * 业务类型 10:对应业务研发净利润创建/编辑 30:对应内部生产净利润创建/编辑
  28 + * */
  29 + private Integer type;
  30 +}
src/main/java/com/order/erp/domain/vo/order/ProjectOptLogResultVO.java 0 → 100644
  1 +package com.order.erp.domain.vo.order;
  2 +
  3 +import lombok.*;
  4 +import lombok.experimental.SuperBuilder;
  5 +
  6 +import java.io.Serializable;
  7 +import java.time.LocalDateTime;
  8 +
  9 +@Data
  10 +@AllArgsConstructor
  11 +@ToString
  12 +@NoArgsConstructor
  13 +@EqualsAndHashCode(callSuper = false)
  14 +@SuperBuilder
  15 +public class ProjectOptLogResultVO implements Serializable {
  16 + private Long id;
  17 + /**
  18 + * 项目号前缀,前八位或者前十位。
  19 + */
  20 + private String projectNoPrefix;
  21 + /**
  22 + * 用户id
  23 + */
  24 + private Long userId;
  25 +
  26 + /**
  27 + * 用户名称
  28 + */
  29 + private String userName;
  30 + /**
  31 + * 操作类型
  32 + */
  33 + private String optType;
  34 + /**
  35 + * 操作字段 json字符串
  36 + */
  37 + private String fields;
  38 +
  39 + private LocalDateTime createTime;
  40 +
  41 +}
src/main/java/com/order/erp/mapper/order/OrderCostDetailedOptLogMapper.java 0 → 100644
  1 +package com.order.erp.mapper.order;
  2 +
  3 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import com.order.erp.domain.dto.order.OrderCostDetailedOptLogDO;
  5 +
  6 +public interface OrderCostDetailedOptLogMapper extends BaseMapper<OrderCostDetailedOptLogDO> {
  7 +}
src/main/java/com/order/erp/mapper/order/ProjectBaseAfterReviewSettingMapper.java 0 → 100644
  1 +package com.order.erp.mapper.order;
  2 +
  3 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import com.order.erp.domain.dto.order.ProjectBaseAfterReviewSettingDO;
  5 +
  6 +public interface ProjectBaseAfterReviewSettingMapper extends BaseMapper<ProjectBaseAfterReviewSettingDO> {
  7 +}
src/main/java/com/order/erp/mapper/order/ProjectBaseDevelopOptLogMapper.java 0 → 100644
  1 +package com.order.erp.mapper.order;
  2 +
  3 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import com.order.erp.domain.dto.order.ProjectBaseDevelopOptLogDO;
  5 +
  6 +
  7 +public interface ProjectBaseDevelopOptLogMapper extends BaseMapper<ProjectBaseDevelopOptLogDO> {
  8 +}
src/main/java/com/order/erp/service/order/IOrderCostInfoService.java
@@ -6,6 +6,10 @@ import com.baomidou.mybatisplus.extension.service.IService; @@ -6,6 +6,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
6 import com.order.erp.domain.vo.order.OrderBaseInfoQueryVO; 6 import com.order.erp.domain.vo.order.OrderBaseInfoQueryVO;
7 import com.order.erp.domain.vo.order.OrderCostInfoVO; 7 import com.order.erp.domain.vo.order.OrderCostInfoVO;
8 import com.order.erp.domain.vo.order.OrderCostInfolockFieldVO; 8 import com.order.erp.domain.vo.order.OrderCostInfolockFieldVO;
  9 +import com.order.erp.domain.vo.order.ProjectBaseInfoQueryVO;
  10 +
  11 +import javax.servlet.http.HttpServletResponse;
  12 +import java.io.IOException;
9 13
10 /** 14 /**
11 * <p> 15 * <p>
@@ -24,4 +28,8 @@ public interface IOrderCostInfoService extends IService&lt;OrderCostInfoDO&gt; { @@ -24,4 +28,8 @@ public interface IOrderCostInfoService extends IService&lt;OrderCostInfoDO&gt; {
24 ServerResult listInnerProfitDetailByPage(OrderBaseInfoQueryVO queryVO); 28 ServerResult listInnerProfitDetailByPage(OrderBaseInfoQueryVO queryVO);
25 29
26 ServerResult listBusinessProfitDetailByPage(OrderBaseInfoQueryVO queryVO); 30 ServerResult listBusinessProfitDetailByPage(OrderBaseInfoQueryVO queryVO);
  31 + void exportBusinessProfitDetailExcel(HttpServletResponse response,ProjectBaseInfoQueryVO queryVO) throws Exception;
  32 + void exportInnerProfitDetailExcel(HttpServletResponse response,ProjectBaseInfoQueryVO queryVO) throws Exception;
  33 + void setPackStatus(OrderCostInfoVO vo);
  34 + void setInnerProduceStatus(OrderCostInfoVO vo);
27 } 35 }
src/main/java/com/order/erp/service/order/IProjectBaseInfoService.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService; @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
6 import com.order.erp.domain.vo.order.*; 6 import com.order.erp.domain.vo.order.*;
7 7
8 import javax.servlet.http.HttpServletResponse; 8 import javax.servlet.http.HttpServletResponse;
  9 +import java.io.IOException;
9 10
10 /** 11 /**
11 * <p> 12 * <p>
@@ -32,4 +33,9 @@ public interface IProjectBaseInfoService extends IService&lt;ProjectBaseInfoDO&gt; { @@ -32,4 +33,9 @@ public interface IProjectBaseInfoService extends IService&lt;ProjectBaseInfoDO&gt; {
32 void exportBusinessProfitInfo(HttpServletResponse response, String projectNoPrefix) throws Exception; 33 void exportBusinessProfitInfo(HttpServletResponse response, String projectNoPrefix) throws Exception;
33 34
34 void exportInnerProfitInfo(HttpServletResponse response, String projectNoPrefix) throws Exception; 35 void exportInnerProfitInfo(HttpServletResponse response, String projectNoPrefix) throws Exception;
  36 + void exportBusinessProfitExcel(HttpServletResponse response, ProjectBaseInfoQueryVO queryVO) throws Exception;
  37 + void exportInnerProfitInfoExcel(HttpServletResponse response, ProjectBaseInfoQueryVO queryVO) throws Exception;
  38 +
  39 + void setProjectBaseInfoDevelopmentStatus(OrderBaseInfoVO vo);
  40 + void setInnerProductionStatus(OrderBaseInfoVO vo);
35 } 41 }
src/main/java/com/order/erp/service/order/OrderCostDetailedOptLogService.java 0 → 100644
  1 +package com.order.erp.service.order;
  2 +
  3 +import com.baomidou.mybatisplus.extension.service.IService;
  4 +import com.order.erp.common.constant.ServerResult;
  5 +import com.order.erp.domain.dto.order.OrderCostDetailedOptLogDO;
  6 +import com.order.erp.domain.vo.order.OrderCostDetailedOptedLogQueryVO;
  7 +
  8 +
  9 +public interface OrderCostDetailedOptLogService extends IService<OrderCostDetailedOptLogDO> {
  10 + ServerResult listByPage(OrderCostDetailedOptedLogQueryVO queryVO);
  11 +
  12 +}
src/main/java/com/order/erp/service/order/ProjectBaseAfterReviewSettingService.java 0 → 100644
  1 +package com.order.erp.service.order;
  2 +
  3 +import com.baomidou.mybatisplus.extension.service.IService;
  4 +import com.order.erp.domain.dto.order.ProjectBaseAfterReviewSettingDO;
  5 +
  6 +public interface ProjectBaseAfterReviewSettingService extends IService<ProjectBaseAfterReviewSettingDO> {
  7 +}
src/main/java/com/order/erp/service/order/ProjectBaseDevelopOptLogService.java 0 → 100644
  1 +package com.order.erp.service.order;
  2 +
  3 +
  4 +import com.baomidou.mybatisplus.extension.service.IService;
  5 +import com.order.erp.common.constant.ServerResult;
  6 +
  7 +import com.order.erp.domain.dto.order.ProjectBaseDevelopOptLogDO;
  8 +import com.order.erp.domain.vo.order.ProjectOptLogQueryVO;
  9 +
  10 +import java.util.List;
  11 +
  12 +public interface ProjectBaseDevelopOptLogService extends IService<ProjectBaseDevelopOptLogDO> {
  13 + ServerResult listByPage(ProjectOptLogQueryVO queryVO);
  14 +}
src/main/java/com/order/erp/service/order/impl/OrderCostDetailedOptLogServiceImpl.java 0 → 100644
  1 +package com.order.erp.service.order.impl;
  2 +
  3 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4 +import com.baomidou.mybatisplus.core.metadata.IPage;
  5 +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  6 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8 +import com.order.erp.common.constant.Constant;
  9 +import com.order.erp.common.constant.ServerResult;
  10 +import com.order.erp.domain.dto.BaseDO;
  11 +import com.order.erp.domain.dto.admin.AdminUserDO;
  12 +import com.order.erp.domain.dto.order.OrderCostDetailedOptLogDO;
  13 +import com.order.erp.domain.dto.order.ProjectBaseDevelopOptLogDO;
  14 +import com.order.erp.domain.vo.order.OrderCostDetailedOptedLogQueryVO;
  15 +import com.order.erp.domain.vo.order.OrderCostOptLogResultVO;
  16 +import com.order.erp.domain.vo.order.ProjectOptLogQueryVO;
  17 +import com.order.erp.domain.vo.order.ProjectOptLogResultVO;
  18 +import com.order.erp.mapper.order.OrderCostDetailedOptLogMapper;
  19 +import com.order.erp.service.admin.AdminUserService;
  20 +import com.order.erp.service.order.OrderCostDetailedOptLogService;
  21 +import org.springframework.beans.BeanUtils;
  22 +import org.springframework.stereotype.Service;
  23 +
  24 +import javax.annotation.Resource;
  25 +import java.util.*;
  26 +import java.util.function.Function;
  27 +import java.util.stream.Collectors;
  28 +
  29 +@Service
  30 +public class OrderCostDetailedOptLogServiceImpl extends ServiceImpl<OrderCostDetailedOptLogMapper, OrderCostDetailedOptLogDO> implements OrderCostDetailedOptLogService{
  31 + @Resource
  32 + private AdminUserService userService;
  33 +
  34 + @Override
  35 + public ServerResult listByPage(OrderCostDetailedOptedLogQueryVO queryVO) {
  36 + LambdaQueryWrapper<OrderCostDetailedOptLogDO> queryWrapper = buildQueryByParam(queryVO);
  37 + Page page = new Page<>(queryVO.getPage(), queryVO.getPageSize());
  38 + IPage<OrderCostDetailedOptLogDO> iPage = page(page, queryWrapper);
  39 +
  40 + Page<OrderCostOptLogResultVO> webVOPage = new Page<>();
  41 + List<OrderCostDetailedOptLogDO> OrderCostDetailedOptLogDOS = iPage.getRecords();
  42 + if (CollectionUtils.isNotEmpty(OrderCostDetailedOptLogDOS)) {
  43 + Set<Long> userIds = OrderCostDetailedOptLogDOS.stream().map(OrderCostDetailedOptLogDO::getUserId).collect(Collectors.toSet());
  44 + Map<Long, AdminUserDO> userDOMap = new HashMap<>();
  45 + if (CollectionUtils.isNotEmpty(userIds)) {
  46 + List<AdminUserDO> userDOS = userService.listByIds(userIds);
  47 + if (CollectionUtils.isNotEmpty(userDOS)) {
  48 + userDOMap = userDOS.stream().collect(Collectors.toMap(AdminUserDO::getId, Function.identity()));
  49 + }
  50 + }
  51 + Map<Long, AdminUserDO> finalUserDOMap = userDOMap;
  52 + List<OrderCostOptLogResultVO> resultVOList = OrderCostDetailedOptLogDOS.stream().map(x -> {
  53 + OrderCostOptLogResultVO resultVO = new OrderCostOptLogResultVO();
  54 + BeanUtils.copyProperties(x, resultVO);
  55 + if (finalUserDOMap.containsKey(x.getUserId())) {
  56 + resultVO.setUserName(finalUserDOMap.get(x.getUserId()).getUserName());
  57 + }
  58 + return resultVO;
  59 + }).collect(Collectors.toList());
  60 +
  61 + webVOPage.setRecords(resultVOList);
  62 + }
  63 + BeanUtils.copyProperties(page, webVOPage, "records");
  64 + return ServerResult.success(webVOPage);
  65 + }
  66 +
  67 + private LambdaQueryWrapper<OrderCostDetailedOptLogDO> buildQueryByParam(OrderCostDetailedOptedLogQueryVO queryVO) {
  68 + return new LambdaQueryWrapper<OrderCostDetailedOptLogDO>()
  69 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  70 + .eq(Objects.nonNull(queryVO.getOrderId()), OrderCostDetailedOptLogDO::getOrderId, queryVO.getOrderId())
  71 + .eq(Objects.nonNull(queryVO.getType()), OrderCostDetailedOptLogDO::getType, queryVO.getType())
  72 + .orderByDesc(OrderCostDetailedOptLogDO::getId);
  73 + }
  74 +
  75 +
  76 +}
src/main/java/com/order/erp/service/order/impl/OrderCostInfoServiceImpl.java
@@ -6,19 +6,22 @@ import cn.hutool.core.collection.CollUtil; @@ -6,19 +6,22 @@ import cn.hutool.core.collection.CollUtil;
6 import com.alibaba.fastjson.JSONObject; 6 import com.alibaba.fastjson.JSONObject;
7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
8 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 8 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  9 +import com.baomidou.mybatisplus.core.toolkit.StringUtils;
9 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 10 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
10 import com.fasterxml.jackson.core.JsonProcessingException; 11 import com.fasterxml.jackson.core.JsonProcessingException;
11 import com.fasterxml.jackson.databind.ObjectMapper; 12 import com.fasterxml.jackson.databind.ObjectMapper;
  13 +import com.github.stupdit1t.excel.common.PoiWorkbookType;
  14 +import com.github.stupdit1t.excel.core.ExcelHelper;
  15 +import com.github.stupdit1t.excel.style.CellPosition;
12 import com.order.erp.common.constant.Constant; 16 import com.order.erp.common.constant.Constant;
13 import com.order.erp.common.constant.ServerResult; 17 import com.order.erp.common.constant.ServerResult;
14 import com.order.erp.common.constant.ServerResultCode; 18 import com.order.erp.common.constant.ServerResultCode;
15 import com.order.erp.common.exception.BusinessException; 19 import com.order.erp.common.exception.BusinessException;
16 import com.order.erp.config.DataScope; 20 import com.order.erp.config.DataScope;
17 -import com.order.erp.domain.ApplyStatusEnum;  
18 -import com.order.erp.domain.ApplyTypeEnum;  
19 -import com.order.erp.domain.OrderLockFieldEnum;  
20 -import com.order.erp.domain.ProjectApplyTypeEnum; 21 +import com.order.erp.domain.*;
21 import com.order.erp.domain.dto.BaseDO; 22 import com.order.erp.domain.dto.BaseDO;
  23 +import com.order.erp.domain.dto.order.OrderBaseInfoDO;
  24 +import com.order.erp.domain.dto.order.OrderCostDetailedOptLogDO;
22 import com.order.erp.domain.dto.order.OrderCostInfoDO; 25 import com.order.erp.domain.dto.order.OrderCostInfoDO;
23 import com.order.erp.domain.dto.order.OrderFieldLockApplyDO; 26 import com.order.erp.domain.dto.order.OrderFieldLockApplyDO;
24 import com.order.erp.domain.model.OrderCostFieldLockRecord; 27 import com.order.erp.domain.model.OrderCostFieldLockRecord;
@@ -26,17 +29,16 @@ import com.order.erp.domain.vo.order.*; @@ -26,17 +29,16 @@ import com.order.erp.domain.vo.order.*;
26 import com.order.erp.mapper.order.OrderCostInfoMapper; 29 import com.order.erp.mapper.order.OrderCostInfoMapper;
27 import com.order.erp.service.IOrderCostFieldLockRecordService; 30 import com.order.erp.service.IOrderCostFieldLockRecordService;
28 import com.order.erp.service.SystemSettingService; 31 import com.order.erp.service.SystemSettingService;
29 -import com.order.erp.service.order.IOrderCostInfoService; 32 +import com.order.erp.service.order.*;
30 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 33 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
31 -import com.order.erp.service.order.OrderBaseInfoService;  
32 -import com.order.erp.service.order.OrderFieldLockApplyService;  
33 -import com.order.erp.service.order.OrderFieldLockRecordService;  
34 import org.springframework.beans.BeanUtils; 34 import org.springframework.beans.BeanUtils;
35 import org.springframework.beans.factory.annotation.Autowired; 35 import org.springframework.beans.factory.annotation.Autowired;
36 import org.springframework.stereotype.Service; 36 import org.springframework.stereotype.Service;
37 import org.springframework.transaction.annotation.Transactional; 37 import org.springframework.transaction.annotation.Transactional;
38 38
39 import javax.annotation.Resource; 39 import javax.annotation.Resource;
  40 +import javax.servlet.http.HttpServletResponse;
  41 +import java.io.IOException;
40 import java.math.BigDecimal; 42 import java.math.BigDecimal;
41 import java.math.RoundingMode; 43 import java.math.RoundingMode;
42 import java.util.*; 44 import java.util.*;
@@ -55,8 +57,6 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -55,8 +57,6 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
55 @Autowired 57 @Autowired
56 private DataScope dataScope; 58 private DataScope dataScope;
57 @Resource 59 @Resource
58 - private OrderFieldLockRecordService orderFieldLockRecordService;  
59 - @Resource  
60 private OrderFieldLockApplyService orderFieldLockApplyService; 60 private OrderFieldLockApplyService orderFieldLockApplyService;
61 @Autowired 61 @Autowired
62 private OrderBaseInfoService orderBaseInfoService; 62 private OrderBaseInfoService orderBaseInfoService;
@@ -64,22 +64,32 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -64,22 +64,32 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
64 private IOrderCostFieldLockRecordService orderCostFieldLockRecordService; 64 private IOrderCostFieldLockRecordService orderCostFieldLockRecordService;
65 @Autowired 65 @Autowired
66 private SystemSettingService systemSettingService; 66 private SystemSettingService systemSettingService;
  67 + @Autowired
  68 + private OrderCostDetailedOptLogService orderCostDetailedOptLogService;
67 69
68 @Override 70 @Override
69 @Transactional(rollbackFor = Exception.class) 71 @Transactional(rollbackFor = Exception.class)
70 public ServerResult edit(OrderCostInfoVO vo) { 72 public ServerResult edit(OrderCostInfoVO vo) {
  73 + Integer type=null;
  74 + String operationDesc=null;
71 Long id = vo.getOrderId(); 75 Long id = vo.getOrderId();
72 Optional<OrderCostInfoDO> orderCostInfoDOOpt = this.lambdaQuery() 76 Optional<OrderCostInfoDO> orderCostInfoDOOpt = this.lambdaQuery()
73 .eq(OrderCostInfoDO::getOrderId, id) 77 .eq(OrderCostInfoDO::getOrderId, id)
74 .last(" limit 1 ") 78 .last(" limit 1 ")
75 .oneOpt(); 79 .oneOpt();
76 OrderCostInfoDO orderCostInfoDO = null; 80 OrderCostInfoDO orderCostInfoDO = null;
77 - if (!orderCostInfoDOOpt.isPresent()) { 81 + OrderCostInfoDO oldOrderCostInfoDO = null;
  82 + boolean isUpdate = orderCostInfoDOOpt.isPresent();
  83 + if (!isUpdate) {
  84 + //对象不存在。
78 orderCostInfoDO = BeanUtil.copyProperties(vo, OrderCostInfoDO.class); 85 orderCostInfoDO = BeanUtil.copyProperties(vo, OrderCostInfoDO.class);
79 } else { 86 } else {
80 orderCostInfoDO = orderCostInfoDOOpt.get(); 87 orderCostInfoDO = orderCostInfoDOOpt.get();
  88 + oldOrderCostInfoDO = BeanUtil.copyProperties(orderCostInfoDO, OrderCostInfoDO.class,"id","orderId","createTime","createBy","modifyTime","modifyBy","enableFlag");
81 BeanUtil.copyProperties(vo, orderCostInfoDO, CopyOptions.create().ignoreNullValue()); 89 BeanUtil.copyProperties(vo, orderCostInfoDO, CopyOptions.create().ignoreNullValue());
82 } 90 }
  91 + // 如果对于新旧数据一致时,则不会进行状态设置。 但是对于第一次创建数据应该怎么办呢? 通过isUpdate来进行判断。 对象不存在时,就不需要判断数据是否一致,对象存在时,就需要进行判断数据是否一致。如果一致,则不要进行状态设置,反之则需要进行状态设置。
  92 +
83 Optional<OrderCostFieldLockRecord> orderCostFieldLockRecordOpt = orderCostFieldLockRecordService 93 Optional<OrderCostFieldLockRecord> orderCostFieldLockRecordOpt = orderCostFieldLockRecordService
84 .lambdaQuery() 94 .lambdaQuery()
85 .eq(OrderCostFieldLockRecord::getOrderId, id) 95 .eq(OrderCostFieldLockRecord::getOrderId, id)
@@ -94,17 +104,49 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -94,17 +104,49 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
94 OrderCostInfolockFieldVO originOrderCostInfolockFieldVO = JSONObject.parseObject(Optional.ofNullable(orderCostFieldLockRecord.getFields()).orElse("{}"), OrderCostInfolockFieldVO.class); 104 OrderCostInfolockFieldVO originOrderCostInfolockFieldVO = JSONObject.parseObject(Optional.ofNullable(orderCostFieldLockRecord.getFields()).orElse("{}"), OrderCostInfolockFieldVO.class);
95 if(Objects.nonNull(vo.getPacketActualRmbTotalPrice())){ 105 if(Objects.nonNull(vo.getPacketActualRmbTotalPrice())){
96 originOrderCostInfolockFieldVO.setPacketActualRmbTotalPrice(OrderLockFieldEnum.LOCKED.name()); 106 originOrderCostInfolockFieldVO.setPacketActualRmbTotalPrice(OrderLockFieldEnum.LOCKED.name());
97 - }else if(Objects.nonNull(vo.getProductionActualPrice())||Objects.nonNull(vo.getProductionDepartmentPredictPrice())) { 107 + type=ProjectOptTypeEnum.PACKAGING_COST_TYPE.getType();
  108 + operationDesc = isUpdate
  109 + ? OrderOptTypeEnum.PROJECT_COST_EDIT.getDesc()
  110 + : OrderOptTypeEnum.PROJECT_COST_ADD.getDesc();
  111 + //编辑包装费用实际金额之后状态为待审核
  112 + /*需要考虑一个问题,假如状态为已通过,但是没有进行任何的修改而点击了确认,那么它的状态会由已审核变为待审核,所以需要进行判断一下,此次传递来的数据是否与上一次的数据一致,如果不一致则需要进行状态设置*/
  113 + if(isUpdate && ProfitStatusEnum.APPROVED.getStatus().equals(oldOrderCostInfoDO.getPackStatus())
  114 + && oldOrderCostInfoDO.getPacketActualRmbTotalPrice().compareTo(vo.getPacketActualRmbTotalPrice()) == 0){
  115 + }else{
  116 + orderCostInfoDO.setPackStatus(ProfitStatusEnum.PENDING_APPROVAL.getStatus());
  117 + }
  118 + }else if(Objects.nonNull(vo.getProductionActualPrice())||Objects.nonNull(vo.getProductionDepartmentPredictUnitPrice())) {
  119 + //todo 以前是直接填写总价,现在是填写单价,然后乘以数量自动计算总价,需要前端传递一个数量参数过来。
  120 + vo.setProductionDepartmentPredictPrice(vo.getProductionDepartmentPredictUnitPrice().multiply(BigDecimal.valueOf(vo.getOrderCount())));
  121 + orderCostInfoDO.setProductionDepartmentPredictPrice(vo.getProductionDepartmentPredictPrice());
98 originOrderCostInfolockFieldVO.setProductionActualPrice(OrderLockFieldEnum.LOCKED.name()); 122 originOrderCostInfolockFieldVO.setProductionActualPrice(OrderLockFieldEnum.LOCKED.name());
99 originOrderCostInfolockFieldVO.setProductionDepartmentPredictPrice(OrderLockFieldEnum.LOCKED.name()); 123 originOrderCostInfolockFieldVO.setProductionDepartmentPredictPrice(OrderLockFieldEnum.LOCKED.name());
  124 + type=ProjectOptTypeEnum.INTERNAL_PRODUCE_DETAILS_TYPE.getType();
  125 + operationDesc = isUpdate
  126 + ? OrderOptTypeEnum.PROJECT_INNER_PRODUCE_PROFIT_EDIT.getDesc()
  127 + : OrderOptTypeEnum.PROJECT_INNER_PRODUCE_PROFIT_ADD.getDesc();
  128 + //编辑生产科预算金额和实际发生费用之后状态为待审核
  129 + /*也需要考虑问题,假如状态为已通过,但是没有进行任何修改二点击了确认,那么它的状态会由已审核变为待审核*/
  130 + if(isUpdate && ProfitStatusEnum.APPROVED.getStatus().equals(oldOrderCostInfoDO.getInnerProduceStatus()) &&
  131 + oldOrderCostInfoDO.getProductionActualPrice().compareTo(vo.getProductionActualPrice()) ==0 &&
  132 + //前端传递的是单价和数量,但是后端只是保存了总价,所以需要进行判断一下,此次传递来的数据和上一次的数据是否一致,如果不一致则需要进行状态设置
  133 + oldOrderCostInfoDO.getProductionDepartmentPredictPrice().compareTo(vo.getProductionDepartmentPredictUnitPrice().multiply(BigDecimal.valueOf(vo.getOrderCount()))) ==0){
  134 + }else{
  135 + orderCostInfoDO.setInnerProduceStatus(ProfitStatusEnum.PENDING_APPROVAL.getStatus());
  136 + }
100 } 137 }
101 orderCostFieldLockRecord.setFields(JSONObject.toJSONString(originOrderCostInfolockFieldVO)); 138 orderCostFieldLockRecord.setFields(JSONObject.toJSONString(originOrderCostInfolockFieldVO));
102 orderCostFieldLockRecordService.saveOrUpdate(orderCostFieldLockRecord); 139 orderCostFieldLockRecordService.saveOrUpdate(orderCostFieldLockRecord);
103 - return ServerResult.success(this.saveOrUpdate(orderCostInfoDO)); 140 + this.saveOrUpdate(orderCostInfoDO);
  141 + //进行日志记录。
  142 + OrderCostInfoVO orderCostInfoVO = buildOrderConstInfoVO(vo, id);
  143 + OrderCostDetailedOptLogDO orderConstOptLogDo = buildOrderConstOptLogDo(id, dataScope.getLoginUserId(),type ,operationDesc,JSONObject.toJSONString(orderCostInfoVO));
  144 + return ServerResult.success(orderCostDetailedOptLogService.save(orderConstOptLogDo));
104 } 145 }
105 146
106 @Override 147 @Override
107 public ServerResult applyEditFileds(OrderCostInfolockFieldVO vo) { 148 public ServerResult applyEditFileds(OrderCostInfolockFieldVO vo) {
  149 + Integer applyType=null;
108 List<OrderFieldLockApplyDO> applyDOS = orderFieldLockApplyService.list(new LambdaQueryWrapper<OrderFieldLockApplyDO>() 150 List<OrderFieldLockApplyDO> applyDOS = orderFieldLockApplyService.list(new LambdaQueryWrapper<OrderFieldLockApplyDO>()
109 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) 151 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
110 .eq(OrderFieldLockApplyDO::getOrderId, vo.getOrderId()) 152 .eq(OrderFieldLockApplyDO::getOrderId, vo.getOrderId())
@@ -118,6 +160,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -118,6 +160,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
118 .packetActualRmbTotalPrice(vo.getPacketActualRmbTotalPrice()) 160 .packetActualRmbTotalPrice(vo.getPacketActualRmbTotalPrice())
119 .productionActualPrice(vo.getProductionActualPrice()) 161 .productionActualPrice(vo.getProductionActualPrice())
120 .productionDepartmentPredictPrice(vo.getProductionDepartmentPredictPrice()) 162 .productionDepartmentPredictPrice(vo.getProductionDepartmentPredictPrice())
  163 + .productionDepartmentPredictUnitPrice(vo.getProductionDepartmentPredictUnitPrice())
121 .build(); 164 .build();
122 OrderFieldLockApplyDO build = OrderFieldLockApplyDO.builder() 165 OrderFieldLockApplyDO build = OrderFieldLockApplyDO.builder()
123 .orderId(vo.getOrderId()) 166 .orderId(vo.getOrderId())
@@ -126,9 +169,16 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -126,9 +169,16 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
126 .fields(JSONObject.toJSONString(lockField)) 169 .fields(JSONObject.toJSONString(lockField))
127 .status(ApplyStatusEnum.WAIT_AUDIT.getStatus()) 170 .status(ApplyStatusEnum.WAIT_AUDIT.getStatus())
128 .type(vo.getType()) 171 .type(vo.getType())
129 - .remark(ApplyTypeEnum.getNameByType(vo.getType())) 172 + .remark(OrderCostApplyTpeEnum.getNameByType(vo.getType()))
130 .build(); 173 .build();
131 orderFieldLockApplyService.save(build); 174 orderFieldLockApplyService.save(build);
  175 + //进行审批记录的保存。需要前端在申请字段申请时传递这条数据的id。
  176 + if(OrderCostApplyTpeEnum.ORDER_PRODUCTION_COST_FIELD_EDIT_APPLY.getType().equals(vo.getType())){
  177 + applyType=OrderCostApplyTpeEnum.ORDER_PRODUCTION_COST_FIELD_EDIT_APPLY.getType();
  178 + }else{
  179 + applyType=OrderCostApplyTpeEnum.ORDER_PACKET_COST_FIELD_EDIT_APPLY.getType();
  180 + }
  181 + orderCostDetailedOptLogService.save(buildOrderConstOptLogDo(vo.getOrderId(), dataScope.getLoginUserId(),applyType,OrderCostApplyTpeEnum.getNameByType(applyType),JSONObject.toJSONString(lockField)));
132 return ServerResult.success(); 182 return ServerResult.success();
133 } 183 }
134 184
@@ -171,6 +221,9 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -171,6 +221,9 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
171 if(Objects.isNull(lockFields.getProductionDepartmentPredictPrice())){ 221 if(Objects.isNull(lockFields.getProductionDepartmentPredictPrice())){
172 lockFields.setProductionDepartmentPredictPrice(Objects.isNull(orderCostInfo) || Objects.isNull(orderCostInfo.getProductionDepartmentPredictPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name()); 222 lockFields.setProductionDepartmentPredictPrice(Objects.isNull(orderCostInfo) || Objects.isNull(orderCostInfo.getProductionDepartmentPredictPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
173 } 223 }
  224 + if(Objects.isNull(lockFields.getProductionDepartmentPredictUnitPrice())){
  225 + lockFields.setProductionDepartmentPredictUnitPrice(Objects.isNull(orderCostInfo) || Objects.isNull(orderCostInfo.getProductionDepartmentPredictUnitPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
  226 + }
174 InnerProfitDetailVO vo = InnerProfitDetailVO.builder() 227 InnerProfitDetailVO vo = InnerProfitDetailVO.builder()
175 .orderId(record.getId()) 228 .orderId(record.getId())
176 .customerCode(record.getCustomerCode()) 229 .customerCode(record.getCustomerCode())
@@ -183,6 +236,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -183,6 +236,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
183 .productionDepartmentTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getProductionDepartmentTotalPrice()) 236 .productionDepartmentTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getProductionDepartmentTotalPrice())
184 .productionDepartmentPredictPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getProductionDepartmentPredictPrice()) 237 .productionDepartmentPredictPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getProductionDepartmentPredictPrice())
185 .productionActualPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getProductionActualPrice()) 238 .productionActualPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getProductionActualPrice())
  239 + .innerProduceStatus((Objects.isNull(record.getOrderCostInfo()) || Objects.isNull(record.getOrderCostInfo().getInnerProduceStatus())) ? ProfitStatusEnum.Not_COMPLETED.getStatus() : record.getOrderCostInfo().getInnerProduceStatus())
186 .lockFields(lockFields) 240 .lockFields(lockFields)
187 .build(); 241 .build();
188 242
@@ -214,6 +268,9 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -214,6 +268,9 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
214 vo.setGrossProfitRate(vo.getGrossProfit().divide(BigDecimal.valueOf(vo.getProductionDepartmentTotalPrice()), 4, RoundingMode.HALF_UP)); 268 vo.setGrossProfitRate(vo.getGrossProfit().divide(BigDecimal.valueOf(vo.getProductionDepartmentTotalPrice()), 4, RoundingMode.HALF_UP));
215 } 269 }
216 } 270 }
  271 + if(Objects.nonNull(vo.getProductionDepartmentPredictPrice())){
  272 + vo.setProductionDepartmentPredictUnitprice(vo.getProductionDepartmentPredictPrice().divide(BigDecimal.valueOf(record.getOrderCount()), 2, RoundingMode.HALF_UP));
  273 + }
217 return vo; 274 return vo;
218 }).collect(Collectors.toList()); 275 }).collect(Collectors.toList());
219 Page<InnerProfitDetailVO> webVOPage = new Page<>(); 276 Page<InnerProfitDetailVO> webVOPage = new Page<>();
@@ -275,6 +332,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -275,6 +332,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
275 .packetPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketPrice()) 332 .packetPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketPrice())
276 .packetTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketTotalPrice()) 333 .packetTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketTotalPrice())
277 .packetActualRmbTotalPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getPacketActualRmbTotalPrice()) 334 .packetActualRmbTotalPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getPacketActualRmbTotalPrice())
  335 + .packStatus((Objects.isNull(record.getOrderCostInfo()) || Objects.isNull(record.getOrderCostInfo().getPackStatus())) ? ProfitStatusEnum.Not_COMPLETED.getStatus() : record.getOrderCostInfo().getPackStatus())
278 .lockFields(lockFields) 336 .lockFields(lockFields)
279 .build(); 337 .build();
280 if (Objects.nonNull(vo.getPacketTotalPrice())) { 338 if (Objects.nonNull(vo.getPacketTotalPrice())) {
@@ -303,4 +361,211 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -303,4 +361,211 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
303 return ServerResult.success(webVOPage); 361 return ServerResult.success(webVOPage);
304 } 362 }
305 363
  364 + @Override
  365 + public void exportBusinessProfitDetailExcel(HttpServletResponse response,ProjectBaseInfoQueryVO queryVO) throws Exception {
  366 + if(CollectionUtils.isEmpty(queryVO.getOrderIds()) &&
  367 + CollectionUtils.isEmpty(queryVO.getProjectNo()) &&
  368 + CollectionUtils.isEmpty(queryVO.getCustomerCode()) &&
  369 + CollectionUtils.isEmpty(queryVO.getInnerNo()) &&
  370 + CollectionUtils.isEmpty(queryVO.getProductionDepartment())){
  371 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  372 + }
  373 + OrderBaseInfoQueryVO.OrderBaseInfoQueryVOBuilder builder = OrderBaseInfoQueryVO.builder()
  374 + .page(1)
  375 + .pageSize(200); // 设置大一点,确保导出数据不遗漏
  376 +
  377 + // 根据传入条件设置筛选字段
  378 + if (CollectionUtils.isNotEmpty(queryVO.getOrderIds())) {
  379 + builder.orderIds(queryVO.getOrderIds());
  380 + } else {
  381 + //如果orderIds为空就代表传递的是筛选条件。
  382 + if (CollectionUtils.isNotEmpty(queryVO.getProjectNo())) {
  383 + builder.projectNo(queryVO.getProjectNo());
  384 + }
  385 + if (CollectionUtils.isNotEmpty(queryVO.getCustomerCode())) {
  386 + builder.customerCode(queryVO.getCustomerCode());
  387 + }
  388 + if (CollectionUtils.isNotEmpty(queryVO.getProductionDepartment())) {
  389 + builder.productionDepartment(queryVO.getProductionDepartment());
  390 + }
  391 + if (CollectionUtils.isNotEmpty(queryVO.getInnerNo())) {
  392 + builder.innerNo(queryVO.getInnerNo());
  393 + }
  394 + }
  395 + ServerResult serverResult = listBusinessProfitDetailByPage(builder.build());
  396 + Page<BusinessProfitDetailVO> page = (Page<BusinessProfitDetailVO>) serverResult.getData();
  397 + List<BusinessProfitDetailVO> businessProfitDetailVOS = page.getRecords();
  398 + System.out.println("订单数量:"+businessProfitDetailVOS.size());
  399 + if(CollectionUtils.isNotEmpty(businessProfitDetailVOS)){
  400 + List<Map<String, Object>> list = buildBusinessProfitExportExcel(businessProfitDetailVOS, queryVO);
  401 + if(CollectionUtils.isNotEmpty(list)){
  402 + List<String> keys = new ArrayList<>(list.get(Constant.ZERO).keySet());
  403 + ExcelHelper.opsExport(PoiWorkbookType.XLSX)
  404 + .opsSheet(list)
  405 + .opsHeader().simple().texts(keys).done()
  406 + .opsColumn().fields(keys).done()
  407 + .height(CellPosition.CELL, 750)
  408 + .done()
  409 + .export(response.getOutputStream());
  410 + System.out.println("导出成功");
  411 + }
  412 + }
  413 + System.out.println(businessProfitDetailVOS);
  414 + }
  415 +
  416 + @Override
  417 + public void exportInnerProfitDetailExcel(HttpServletResponse response, ProjectBaseInfoQueryVO queryVO) throws Exception {
  418 + if(CollectionUtils.isEmpty(queryVO.getOrderIds()) &&
  419 + CollectionUtils.isEmpty(queryVO.getProjectNo()) &&
  420 + CollectionUtils.isEmpty(queryVO.getCustomerCode()) &&
  421 + CollectionUtils.isEmpty(queryVO.getInnerNo()) &&
  422 + CollectionUtils.isEmpty(queryVO.getProductionDepartment())){
  423 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  424 + }
  425 + OrderBaseInfoQueryVO.OrderBaseInfoQueryVOBuilder builder = OrderBaseInfoQueryVO.builder()
  426 + .page(1)
  427 + .pageSize(200); //设置大一点,确保导出数据不遗漏
  428 + if(CollectionUtils.isNotEmpty(queryVO.getOrderIds())){
  429 + builder.orderIds(queryVO.getOrderIds());
  430 + }else{
  431 + //如果orderIds为空就代表传递的是筛选条件。
  432 + if(CollectionUtils.isNotEmpty(queryVO.getProjectNo())){
  433 + builder.projectNo(queryVO.getProjectNo());
  434 + }
  435 + if(CollectionUtils.isNotEmpty(queryVO.getCustomerCode())){
  436 + builder.customerCode(queryVO.getCustomerCode());
  437 + }
  438 + if(CollectionUtils.isNotEmpty(queryVO.getProductionDepartment())){
  439 + builder.productionDepartment(queryVO.getProductionDepartment());
  440 + }
  441 + if(CollectionUtils.isNotEmpty(queryVO.getInnerNo())){
  442 + builder.innerNo(queryVO.getInnerNo());
  443 + }
  444 + }
  445 + //这里设置为100是故意设置大一点,防止导出多条数据。
  446 + ServerResult<Page<InnerProfitDetailVO>> serverResult= listInnerProfitDetailByPage(builder.build());
  447 + Page<InnerProfitDetailVO> page=(Page<InnerProfitDetailVO>) serverResult.getData();
  448 + List<InnerProfitDetailVO> innerProfitDetailVOS = page.getRecords();
  449 + System.out.println("订单数量"+innerProfitDetailVOS.size());
  450 + if(CollectionUtils.isNotEmpty(innerProfitDetailVOS)){
  451 + List<Map<String, Object>> list = buildInnerProfitDetailExcel(innerProfitDetailVOS, queryVO);
  452 + if(CollectionUtils.isNotEmpty(list)){
  453 + List<String> keys = new ArrayList<>(list.get(Constant.ZERO).keySet());
  454 + ExcelHelper.opsExport(PoiWorkbookType.XLSX)
  455 + .opsSheet(list)
  456 + .opsHeader().simple().texts(keys).done()
  457 + .opsColumn().fields(keys).done()
  458 + .height(CellPosition.CELL, 750)
  459 + .done()
  460 + .export(response.getOutputStream());
  461 + System.out.println("导出成功");
  462 + }
  463 + }
  464 + }
  465 +
  466 + @Override
  467 + public void setPackStatus(OrderCostInfoVO vo) {
  468 + //首先判断orderId是否为空。
  469 + if(Objects.isNull(vo.getOrderId())){
  470 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  471 + }
  472 + OrderCostInfoDO orderCostInfoDO = getOne(new LambdaQueryWrapper<OrderCostInfoDO>()
  473 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  474 + .eq(OrderCostInfoDO::getOrderId, vo.getOrderId())
  475 + .last("limit 1"));
  476 + if(Objects.isNull(orderCostInfoDO)){
  477 + throw new BusinessException(ServerResultCode.EMPTY_LIST);
  478 + }
  479 + orderCostInfoDO.setPackStatus(ProfitStatusEnum.APPROVED.getStatus());
  480 + updateById(orderCostInfoDO);
  481 + }
  482 +
  483 + @Override
  484 + public void setInnerProduceStatus(OrderCostInfoVO vo) {
  485 + if(Objects.isNull(vo.getOrderId())){
  486 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  487 + }
  488 + OrderCostInfoDO orderCostInfoDO = getOne(new LambdaQueryWrapper<OrderCostInfoDO>()
  489 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  490 + .eq(OrderCostInfoDO::getOrderId, vo.getOrderId())
  491 + .last("limit 1"));
  492 + if(Objects.isNull(orderCostInfoDO)){
  493 + throw new BusinessException(ServerResultCode.EMPTY_LIST);
  494 + }
  495 + orderCostInfoDO.setInnerProduceStatus(ProfitStatusEnum.APPROVED.getStatus());
  496 + updateById(orderCostInfoDO);
  497 + }
  498 +
  499 +
  500 + private OrderCostDetailedOptLogDO buildOrderConstOptLogDo(Long orderId, Long userId , Integer type, String optType, String field){
  501 + return OrderCostDetailedOptLogDO.builder()
  502 + .orderId(orderId)
  503 + .userId(userId)
  504 + .type(type)
  505 + .optType(optType)
  506 + .fields(field)
  507 + .build();
  508 + }
  509 + private OrderCostInfoVO buildOrderConstInfoVO(OrderCostInfoVO vo,Long orderId){
  510 + OrderCostInfoVO orderCostInfoVO = new OrderCostInfoVO();
  511 + BeanUtils.copyProperties(vo, orderCostInfoVO, "id");
  512 + orderCostInfoVO.setId(orderId);
  513 + return orderCostInfoVO;
  514 + }
  515 +
  516 + private List<Map<String,Object>> buildBusinessProfitExportExcel(List<BusinessProfitDetailVO> businessProfitDetailVOS,ProjectBaseInfoQueryVO queryVO){
  517 + List<Map<String,Object>> list= new ArrayList<>();
  518 + for(BusinessProfitDetailVO vo:businessProfitDetailVOS){
  519 + Map<String, Object> map = new LinkedHashMap<>();
  520 + map.put("客户编码",Objects.nonNull(vo.getCustomerCode()) ? vo.getCustomerCode() : "");
  521 + map.put("项目号",Objects.nonNull(vo.getProjectNo()) ? vo.getProjectNo() : "");
  522 + map.put("生产科",Objects.nonNull(vo.getProductionDepartment()) ? vo.getProductionDepartment() : "");
  523 + map.put("内部编号",Objects.nonNull(vo.getInnerNo()) ? vo.getInnerNo() : "");
  524 + map.put("图片地址",Objects.nonNull(vo.getPicUrl()) ? vo.getPicUrl() : "");
  525 + map.put("订单数量",Objects.nonNull(vo.getOrderCount()) ? vo.getOrderCount() : "");
  526 + map.put("包装费用$",Objects.nonNull(vo.getPacketPrice()) ? String.format("%.2f",vo.getPacketPrice()) : "");
  527 + map.put("包装费用合计$",Objects.nonNull(vo.getPacketTotalPrice()) ? String.format("%.2f",vo.getPacketTotalPrice()) : "");
  528 + map.put("包装费用合计¥",Objects.nonNull(vo.getPacketRmbTotalPrice()) ? String.format("%.2f",vo.getPacketRmbTotalPrice()) : "");
  529 + map.put("包装费用实际金额¥",Objects.nonNull(vo.getPacketActualRmbTotalPrice()) ? vo.getPacketActualRmbTotalPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  530 + map.put("实际跟单单价¥",Objects.nonNull(vo.getPacketActualRmbPrice()) ? vo.getPacketActualRmbPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  531 + map.put("实际跟单单价$",Objects.nonNull(vo.getPacketActualPrice()) ? vo.getPacketActualPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  532 + map.put("包装费用净利润率",Objects.nonNull(vo.getPacketProfitRate()) ? vo.getPacketProfitRate().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%" : "");
  533 +// if(StringUtils.isNotBlank(queryVO.getBusinessCostExportSelect().getPacketPrice()) &&
  534 +// OrderLockFieldEnum.SELECTED.name().equals(queryVO.getBusinessCostExportSelect().getPacketPrice())){
  535 +//
  536 +// }
  537 + list.add(map);
  538 + }
  539 + return list;
  540 + }
  541 +
  542 + private List<Map<String,Object>> buildInnerProfitDetailExcel(List<InnerProfitDetailVO> innerProfitDetailVOS, ProjectBaseInfoQueryVO queryVO){
  543 + List<Map<String,Object>> list = new ArrayList<>();
  544 + for (InnerProfitDetailVO vo:innerProfitDetailVOS){
  545 + Map<String, Object> hashMap = new LinkedHashMap<>();
  546 + hashMap.put("客户编码",Objects.nonNull(vo.getCustomerCode()) ? vo.getCustomerCode() : "");
  547 + hashMap.put("项目号",Objects.nonNull(vo.getProjectNo()) ? vo.getProjectNo() : "");
  548 + hashMap.put("生产科",Objects.nonNull(vo.getProductionDepartment()) ? vo.getProductionDepartment() : "");
  549 + hashMap.put("内部编号",Objects.nonNull(vo.getInnerNo()) ? vo.getInnerNo() : "");
  550 + hashMap.put("图片地址",Objects.nonNull(vo.getPicUrl()) ? vo.getPicUrl() : "");
  551 + hashMap.put("订单数量",Objects.nonNull(vo.getOrderCount()) ? vo.getOrderCount() : "");
  552 + hashMap.put("生产科单价¥",Objects.nonNull(vo.getProductionDepartmentPrice()) ? String.format("%.2f",vo.getProductionDepartmentPrice()) : "");
  553 + hashMap.put("生产科总价¥",Objects.nonNull(vo.getProductionDepartmentTotalPrice()) ? String.format("%.2f",vo.getProductionDepartmentTotalPrice()) : "");
  554 + hashMap.put("生产科预算金额¥",Objects.nonNull(vo.getProductionDepartmentPredictPrice()) ? vo.getProductionDepartmentPredictPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  555 + hashMap.put("实际发生费用¥",Objects.nonNull(vo.getProductionActualPrice()) ? vo.getProductionActualPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  556 + hashMap.put("预算占比",Objects.nonNull(vo.getPredictRatio()) ? vo.getPredictRatio().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%" : "");
  557 + hashMap.put("预算占比与实际占比差",Objects.nonNull(vo.getPredictAndActualRatio()) ? vo.getPredictAndActualRatio().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%" : "");
  558 + hashMap.put("事前毛利润",Objects.nonNull(vo.getBeforeGrossProfit()) ? vo.getBeforeGrossProfit().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  559 + hashMap.put("事前毛利率",Objects.nonNull(vo.getBeforeGrossProfitRate()) ? vo.getBeforeGrossProfitRate().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%" : "");
  560 + hashMap.put("事后毛利润",Objects.nonNull(vo.getGrossProfit()) ? vo.getGrossProfit().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  561 + hashMap.put("事后毛利率",Objects.nonNull(vo.getGrossProfitRate()) ? vo.getGrossProfitRate().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%" : "");
  562 + /*if(StringUtils.isNotBlank(queryVO.getInnerProfitDetailExportSelect().getProductionDepartmentPrice()) &&
  563 + OrderLockFieldEnum.SELECTED.name().equals(queryVO.getInnerProfitDetailExportSelect().getProductionDepartmentPrice())){
  564 +
  565 + }*/
  566 + list.add(hashMap);
  567 + }
  568 + return list;
  569 + }
  570 +
306 } 571 }
src/main/java/com/order/erp/service/order/impl/OrderFieldLockApplyServiceImpl.java
@@ -134,9 +134,10 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp @@ -134,9 +134,10 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
134 if (ApplyTypeEnum.FIELD_EDIT_APPLY.getType().equals(x.getType())) { 134 if (ApplyTypeEnum.FIELD_EDIT_APPLY.getType().equals(x.getType())) {
135 resultVO.setFieldInfos(JSONObject.parseObject(fields, OrderLockFieldVO.class)); 135 resultVO.setFieldInfos(JSONObject.parseObject(fields, OrderLockFieldVO.class));
136 } 136 }
137 - if (Stream.of(ApplyTypeEnum.ORDER_PACKET_COST_FIELD_EDIT_APPLY,  
138 - ApplyTypeEnum.ORDER_PRODUCTION_COST_FIELD_EDIT_APPLY)  
139 - .map(ApplyTypeEnum::getType) 137 + // todo
  138 + if (Stream.of(OrderCostApplyTpeEnum.ORDER_PACKET_COST_FIELD_EDIT_APPLY,
  139 + OrderCostApplyTpeEnum.ORDER_PRODUCTION_COST_FIELD_EDIT_APPLY)
  140 + .map(OrderCostApplyTpeEnum::getType)
140 .anyMatch(type -> type.equals(x.getType()))) { 141 .anyMatch(type -> type.equals(x.getType()))) {
141 OrderCostInfolockFieldVO orderCostInfolockFieldVO = JSONObject.parseObject(fields, OrderCostInfolockFieldVO.class); 142 OrderCostInfolockFieldVO orderCostInfolockFieldVO = JSONObject.parseObject(fields, OrderCostInfolockFieldVO.class);
142 resultVO.setFieldInfos(OrderLockFieldVO.builder().costInfolockFieldVO(orderCostInfolockFieldVO).build()); 143 resultVO.setFieldInfos(OrderLockFieldVO.builder().costInfolockFieldVO(orderCostInfolockFieldVO).build());
@@ -824,9 +825,10 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp @@ -824,9 +825,10 @@ public class OrderFieldLockApplyServiceImpl extends ServiceImpl&lt;OrderFieldLockAp
824 } 825 }
825 } 826 }
826 checkBillOrderService.updateById(invoiceInfoDO); 827 checkBillOrderService.updateById(invoiceInfoDO);
827 - } else if (Stream.of(ApplyTypeEnum.ORDER_PACKET_COST_FIELD_EDIT_APPLY,  
828 - ApplyTypeEnum.ORDER_PRODUCTION_COST_FIELD_EDIT_APPLY)  
829 - .map(ApplyTypeEnum::getType) 828 + //todo
  829 + } else if (Stream.of(OrderCostApplyTpeEnum.ORDER_PACKET_COST_FIELD_EDIT_APPLY,
  830 + OrderCostApplyTpeEnum.ORDER_PRODUCTION_COST_FIELD_EDIT_APPLY)
  831 + .map(OrderCostApplyTpeEnum::getType)
830 .anyMatch(x -> x.equals(applyDO.getType()))) { 832 .anyMatch(x -> x.equals(applyDO.getType()))) {
831 applyDO.setAuditUserId(auditUserId); 833 applyDO.setAuditUserId(auditUserId);
832 applyDO.setStatus(ApplyStatusEnum.AUDIT_PASS.getStatus()); 834 applyDO.setStatus(ApplyStatusEnum.AUDIT_PASS.getStatus());
src/main/java/com/order/erp/service/order/impl/ProjectBaseAfterReviewSettingServiceImpl.java 0 → 100644
  1 +package com.order.erp.service.order.impl;
  2 +
  3 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4 +import com.order.erp.domain.dto.order.ProjectBaseAfterReviewSettingDO;
  5 +import com.order.erp.mapper.order.ProjectBaseAfterReviewSettingMapper;
  6 +import com.order.erp.service.order.ProjectBaseAfterReviewSettingService;
  7 +import lombok.extern.slf4j.Slf4j;
  8 +import org.springframework.stereotype.Service;
  9 +
  10 +@Slf4j
  11 +@Service
  12 +public class ProjectBaseAfterReviewSettingServiceImpl extends ServiceImpl<ProjectBaseAfterReviewSettingMapper, ProjectBaseAfterReviewSettingDO> implements ProjectBaseAfterReviewSettingService {
  13 +}
src/main/java/com/order/erp/service/order/impl/ProjectBaseDevelopOptLogServiceImpl.java 0 → 100644
  1 +package com.order.erp.service.order.impl;
  2 +
  3 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4 +import com.baomidou.mybatisplus.core.metadata.IPage;
  5 +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  6 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7 +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  8 +import com.order.erp.common.constant.Constant;
  9 +import com.order.erp.common.constant.ServerResult;
  10 +import com.order.erp.domain.dto.BaseDO;
  11 +import com.order.erp.domain.dto.admin.AdminUserDO;
  12 +import com.order.erp.domain.dto.order.ProjectBaseDevelopOptLogDO;
  13 +import com.order.erp.domain.vo.order.ProjectOptLogQueryVO;
  14 +import com.order.erp.domain.vo.order.ProjectOptLogResultVO;
  15 +import com.order.erp.mapper.order.ProjectBaseDevelopOptLogMapper;
  16 +import com.order.erp.service.admin.AdminUserService;
  17 +
  18 +import com.order.erp.service.order.ProjectBaseDevelopOptLogService;
  19 +import org.springframework.beans.BeanUtils;
  20 +import org.springframework.stereotype.Service;
  21 +
  22 +import javax.annotation.Resource;
  23 +import java.util.*;
  24 +import java.util.function.Function;
  25 +import java.util.stream.Collectors;
  26 +
  27 +@Service
  28 +public class ProjectBaseDevelopOptLogServiceImpl extends ServiceImpl<ProjectBaseDevelopOptLogMapper, ProjectBaseDevelopOptLogDO> implements ProjectBaseDevelopOptLogService {
  29 + @Resource
  30 + private AdminUserService userService;
  31 +
  32 + @Override
  33 + public ServerResult listByPage(ProjectOptLogQueryVO queryVO) {
  34 + LambdaQueryWrapper<ProjectBaseDevelopOptLogDO> queryWrapper = buildQueryByParam(queryVO);
  35 + Page page = new Page<>(queryVO.getPage(), queryVO.getPageSize());
  36 + IPage<ProjectBaseDevelopOptLogDO> iPage = page(page, queryWrapper);
  37 +
  38 + Page<ProjectOptLogResultVO> webVOPage = new Page<>();
  39 + List<ProjectBaseDevelopOptLogDO> ProjectDevelopOptLogDOS = iPage.getRecords();
  40 + if (CollectionUtils.isNotEmpty(ProjectDevelopOptLogDOS)) {
  41 + Set<Long> userIds = ProjectDevelopOptLogDOS.stream().map(ProjectBaseDevelopOptLogDO::getUserId).collect(Collectors.toSet());
  42 + Map<Long, AdminUserDO> userDOMap = new HashMap<>();
  43 + if (CollectionUtils.isNotEmpty(userIds)) {
  44 + List<AdminUserDO> userDOS = userService.listByIds(userIds);
  45 + if (CollectionUtils.isNotEmpty(userDOS)) {
  46 + userDOMap = userDOS.stream().collect(Collectors.toMap(AdminUserDO::getId, Function.identity()));
  47 + }
  48 + }
  49 + Map<Long, AdminUserDO> finalUserDOMap = userDOMap;
  50 + List<ProjectOptLogResultVO> resultVOList = ProjectDevelopOptLogDOS.stream().map(x -> {
  51 + ProjectOptLogResultVO resultVO = new ProjectOptLogResultVO();
  52 + BeanUtils.copyProperties(x, resultVO);
  53 + if (finalUserDOMap.containsKey(x.getUserId())) {
  54 + resultVO.setUserName(finalUserDOMap.get(x.getUserId()).getUserName());
  55 + }
  56 + return resultVO;
  57 + }).collect(Collectors.toList());
  58 +
  59 + webVOPage.setRecords(resultVOList);
  60 + }
  61 + BeanUtils.copyProperties(page, webVOPage, "records");
  62 + return ServerResult.success(webVOPage);
  63 + }
  64 +
  65 + private LambdaQueryWrapper<ProjectBaseDevelopOptLogDO> buildQueryByParam(ProjectOptLogQueryVO queryVO) {
  66 + return new LambdaQueryWrapper<ProjectBaseDevelopOptLogDO>()
  67 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  68 + .eq(Objects.nonNull(queryVO.getProjectNoPrefix()), ProjectBaseDevelopOptLogDO::getProjectNoPrefix, queryVO.getProjectNoPrefix())
  69 + .eq(Objects.nonNull(queryVO.getType()), ProjectBaseDevelopOptLogDO::getType, queryVO.getType())
  70 + .orderByDesc(ProjectBaseDevelopOptLogDO::getId);
  71 + }
  72 +}
0 \ No newline at end of file 73 \ No newline at end of file
src/main/java/com/order/erp/service/order/impl/ProjectBaseInfoServiceImpl.java
@@ -3,37 +3,38 @@ package com.order.erp.service.order.impl; @@ -3,37 +3,38 @@ package com.order.erp.service.order.impl;
3 import cn.hutool.core.bean.BeanUtil; 3 import cn.hutool.core.bean.BeanUtil;
4 import cn.hutool.core.bean.copier.CopyOptions; 4 import cn.hutool.core.bean.copier.CopyOptions;
5 import cn.hutool.core.collection.CollUtil; 5 import cn.hutool.core.collection.CollUtil;
  6 +import com.alibaba.fastjson.JSON;
6 import com.alibaba.fastjson.JSONObject; 7 import com.alibaba.fastjson.JSONObject;
  8 +import com.alibaba.fastjson.TypeReference;
7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 9 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
8 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 10 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
9 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 11 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
10 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 12 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
11 import com.fasterxml.jackson.core.JsonProcessingException; 13 import com.fasterxml.jackson.core.JsonProcessingException;
12 import com.fasterxml.jackson.databind.ObjectMapper; 14 import com.fasterxml.jackson.databind.ObjectMapper;
  15 +import com.github.stupdit1t.excel.common.PoiWorkbookType;
  16 +import com.github.stupdit1t.excel.core.ExcelHelper;
  17 +import com.github.stupdit1t.excel.style.CellPosition;
13 import com.order.erp.common.constant.Constant; 18 import com.order.erp.common.constant.Constant;
14 import com.order.erp.common.constant.ServerResult; 19 import com.order.erp.common.constant.ServerResult;
15 import com.order.erp.common.constant.ServerResultCode; 20 import com.order.erp.common.constant.ServerResultCode;
16 import com.order.erp.common.exception.BusinessException; 21 import com.order.erp.common.exception.BusinessException;
  22 +import com.order.erp.common.utils.TransactionHelper;
17 import com.order.erp.config.DataScope; 23 import com.order.erp.config.DataScope;
18 -import com.order.erp.domain.ApplyStatusEnum;  
19 -import com.order.erp.domain.OrderLockFieldEnum;  
20 -import com.order.erp.domain.ProjectApplyTypeEnum;  
21 -import com.order.erp.domain.ProjectFieldEditType; 24 +import com.order.erp.domain.*;
22 import com.order.erp.domain.dto.BaseDO; 25 import com.order.erp.domain.dto.BaseDO;
23 import com.order.erp.domain.dto.SystemSettingDO; 26 import com.order.erp.domain.dto.SystemSettingDO;
24 -import com.order.erp.domain.dto.order.OrderBaseInfoDO;  
25 -import com.order.erp.domain.dto.order.ProjectBaseInfoDO; 27 +import com.order.erp.domain.dto.order.*;
26 import com.order.erp.domain.model.ProjectApplyDO; 28 import com.order.erp.domain.model.ProjectApplyDO;
27 import com.order.erp.domain.model.ProjectFieldLockRecord; 29 import com.order.erp.domain.model.ProjectFieldLockRecord;
  30 +import com.order.erp.domain.vo.CostSettingItemVO;
28 import com.order.erp.domain.vo.order.*; 31 import com.order.erp.domain.vo.order.*;
29 import com.order.erp.mapper.order.ProjectBaseInfoMapper; 32 import com.order.erp.mapper.order.ProjectBaseInfoMapper;
30 import com.order.erp.service.IProjectFieldLockRecordService; 33 import com.order.erp.service.IProjectFieldLockRecordService;
31 import com.order.erp.service.SystemSettingService; 34 import com.order.erp.service.SystemSettingService;
32 import com.order.erp.service.impl.ProjectApplyServiceImpl; 35 import com.order.erp.service.impl.ProjectApplyServiceImpl;
33 -import com.order.erp.service.order.IProjectBaseInfoService; 36 +import com.order.erp.service.order.*;
34 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 37 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
35 -import com.order.erp.service.order.OrderBaseInfoService;  
36 -import com.order.erp.service.order.OrderProfitAnalysisService;  
37 import org.apache.commons.lang3.StringUtils; 38 import org.apache.commons.lang3.StringUtils;
38 import org.apache.poi.ss.usermodel.*; 39 import org.apache.poi.ss.usermodel.*;
39 import org.apache.poi.ss.util.CellRangeAddress; 40 import org.apache.poi.ss.util.CellRangeAddress;
@@ -42,8 +43,11 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -42,8 +43,11 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
42 import org.springframework.beans.BeanUtils; 43 import org.springframework.beans.BeanUtils;
43 import org.springframework.beans.factory.annotation.Autowired; 44 import org.springframework.beans.factory.annotation.Autowired;
44 import org.springframework.stereotype.Service; 45 import org.springframework.stereotype.Service;
  46 +import org.springframework.transaction.annotation.Transactional;
45 47
  48 +import javax.annotation.Resource;
46 import javax.servlet.http.HttpServletResponse; 49 import javax.servlet.http.HttpServletResponse;
  50 +import java.io.IOException;
47 import java.io.OutputStream; 51 import java.io.OutputStream;
48 import java.math.BigDecimal; 52 import java.math.BigDecimal;
49 import java.math.RoundingMode; 53 import java.math.RoundingMode;
@@ -77,21 +81,34 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -77,21 +81,34 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
77 private OrderProfitAnalysisService projectProfitAnalysisService; 81 private OrderProfitAnalysisService projectProfitAnalysisService;
78 @Autowired 82 @Autowired
79 private SystemSettingService systemSettingService; 83 private SystemSettingService systemSettingService;
  84 + @Autowired
  85 + private ProjectBaseDevelopOptLogService projectBaseDevelopOptLogService;
  86 + @Autowired
  87 + private ProjectBaseAfterReviewSettingService projectBaseAfterReviewSettingService;
  88 + @Resource
  89 + private TransactionHelper transactionHelper;
80 90
81 @Override 91 @Override
  92 + @Transactional(rollbackFor = Exception.class)
82 public ServerResult edit(ProjectBaseInfoVO vo) { 93 public ServerResult edit(ProjectBaseInfoVO vo) {
  94 + Integer type = null;
  95 + String operationDesc =null;
83 String projectNoPrefix = vo.getProjectNoPrefix(); 96 String projectNoPrefix = vo.getProjectNoPrefix();
84 Optional<ProjectBaseInfoDO> projectBaseInfoDOOpt = this.lambdaQuery() 97 Optional<ProjectBaseInfoDO> projectBaseInfoDOOpt = this.lambdaQuery()
85 .eq(ProjectBaseInfoDO::getProjectNoPrefix, projectNoPrefix) 98 .eq(ProjectBaseInfoDO::getProjectNoPrefix, projectNoPrefix)
86 .last(" limit 1 ") 99 .last(" limit 1 ")
87 .oneOpt(); 100 .oneOpt();
  101 + ProjectBaseInfoDO oldProjectBaseInfoDO = null;
88 ProjectBaseInfoDO projectBaseInfoDO = null; 102 ProjectBaseInfoDO projectBaseInfoDO = null;
89 - if (projectBaseInfoDOOpt.isPresent()) { 103 + boolean isUpdate = projectBaseInfoDOOpt.isPresent();
  104 + if (isUpdate) {
90 projectBaseInfoDO = projectBaseInfoDOOpt.get(); 105 projectBaseInfoDO = projectBaseInfoDOOpt.get();
  106 + oldProjectBaseInfoDO = BeanUtil.copyProperties(projectBaseInfoDOOpt.get(), ProjectBaseInfoDO.class,"id","projectNoPrefix","createTime","createBy","modifyTime","modifyBy","enableFlag"); // 深拷贝
91 BeanUtil.copyProperties(vo, projectBaseInfoDO, CopyOptions.create().setIgnoreProperties("id").ignoreNullValue()); 107 BeanUtil.copyProperties(vo, projectBaseInfoDO, CopyOptions.create().setIgnoreProperties("id").ignoreNullValue());
92 } else { 108 } else {
93 projectBaseInfoDO = BeanUtil.copyProperties(vo, ProjectBaseInfoDO.class); 109 projectBaseInfoDO = BeanUtil.copyProperties(vo, ProjectBaseInfoDO.class);
94 } 110 }
  111 + //通过排序取出最新的锁定记录。来重新设置锁定记录。 因为你编辑之后,所以就必须要进行锁定LOCKED。
95 ProjectFieldLockRecord recordDO = projectionFieldLockRecordService.getOne(new LambdaQueryWrapper<ProjectFieldLockRecord>() 112 ProjectFieldLockRecord recordDO = projectionFieldLockRecordService.getOne(new LambdaQueryWrapper<ProjectFieldLockRecord>()
96 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) 113 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
97 .eq(ProjectFieldLockRecord::getProjectNoPrefix, projectNoPrefix) 114 .eq(ProjectFieldLockRecord::getProjectNoPrefix, projectNoPrefix)
@@ -117,9 +134,36 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -117,9 +134,36 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
117 recordLockFieldVO.setSpainPaidRmbCommission("LOCKED"); 134 recordLockFieldVO.setSpainPaidRmbCommission("LOCKED");
118 recordLockFieldVO.setPaidRmbCommission("LOCKED"); 135 recordLockFieldVO.setPaidRmbCommission("LOCKED");
119 recordLockFieldVO.setActualExchangeRate("LOCKED"); 136 recordLockFieldVO.setActualExchangeRate("LOCKED");
  137 + type=ProjectOptTypeEnum.BUSINESS_NET_PROFIT_TYPE.getType();
  138 + operationDesc = isUpdate
  139 + ? OrderOptTypeEnum.PROJECT_DEVELOPMENT_PROFIT_EDIT.getDesc()
  140 + : OrderOptTypeEnum.PROJECT_DEVELOPMENT_PROFIT_ADD.getDesc();
  141 + /*这里还需要考虑一下,对于状态已经是已审批的状态,但是在编辑数据时没有发生任何改变,也需要重新设置为待审核状态吗?不需要,这里处理一下,对于这种情况就不需要重新设置状态*/
  142 + if(isUpdate && oldProjectBaseInfoDO.getDevelopmentStatus().equals(ProfitStatusEnum.APPROVED.getStatus()) &&
  143 + oldProjectBaseInfoDO.getProjectStartTime().isEqual(vo.getProjectStartTime()) &&
  144 + oldProjectBaseInfoDO.getProjectEndTime().isEqual(vo.getProjectEndTime()) &&
  145 + oldProjectBaseInfoDO.getDevelopmentCopyRmbTotalPrice().compareTo(vo.getDevelopmentCopyRmbTotalPrice()) == 0 &&
  146 + oldProjectBaseInfoDO.getSpainPaidRmbCommission().compareTo(vo.getSpainPaidRmbCommission()) == 0 &&
  147 + oldProjectBaseInfoDO.getPaidRmbCommission().compareTo(vo.getPaidRmbCommission()) == 0 &&
  148 + //todo 这个实际汇率是否需要,需要讨论。
  149 + oldProjectBaseInfoDO.getActualExchangeRate().compareTo(vo.getActualExchangeRate()) == 0
  150 + ){
  151 + }else{
  152 + projectBaseInfoDO.setDevelopmentStatus(ProfitStatusEnum.PENDING_APPROVAL.getStatus());
  153 + }
120 } else if (Objects.nonNull(vo.getProjectInnerProfitInfoStartTime()) || Objects.nonNull(vo.getProjectInnerProfitInfoEndTime())) { 154 } else if (Objects.nonNull(vo.getProjectInnerProfitInfoStartTime()) || Objects.nonNull(vo.getProjectInnerProfitInfoEndTime())) {
121 recordLockFieldVO.setProjectInnerProfitInfoStartTime("LOCKED"); 155 recordLockFieldVO.setProjectInnerProfitInfoStartTime("LOCKED");
122 recordLockFieldVO.setProjectInnerProfitInfoEndTime("LOCKED"); 156 recordLockFieldVO.setProjectInnerProfitInfoEndTime("LOCKED");
  157 + type=ProjectOptTypeEnum.INTERNAL_BUSINESS_NET_PROFIT_TYPE.getType();
  158 + operationDesc = isUpdate
  159 + ? OrderOptTypeEnum.PROJECT_INNER_PRODUCE_EDIT.getDesc()
  160 + : OrderOptTypeEnum.PROJECT_INNER_PRODUCE_ADD.getDesc();
  161 + if(isUpdate && oldProjectBaseInfoDO.getInnerProductionStatus().equals(ProfitStatusEnum.APPROVED.getStatus()) &&
  162 + oldProjectBaseInfoDO.getProjectInnerProfitInfoStartTime().isEqual(vo.getProjectInnerProfitInfoStartTime()) &&
  163 + oldProjectBaseInfoDO.getProjectInnerProfitInfoEndTime().isEqual(vo.getProjectInnerProfitInfoEndTime())){
  164 + }else{
  165 + projectBaseInfoDO.setInnerProductionStatus(ProfitStatusEnum.PENDING_APPROVAL.getStatus());
  166 + }
123 } 167 }
124 recordDO.setFields(JSONObject.toJSONString(recordLockFieldVO)); 168 recordDO.setFields(JSONObject.toJSONString(recordLockFieldVO));
125 if (Objects.isNull(recordDO.getId())) { 169 if (Objects.isNull(recordDO.getId())) {
@@ -127,11 +171,16 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -127,11 +171,16 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
127 } else { 171 } else {
128 projectionFieldLockRecordService.updateById(recordDO); 172 projectionFieldLockRecordService.updateById(recordDO);
129 } 173 }
130 - return ServerResult.success(this.saveOrUpdate(projectBaseInfoDO)); 174 + this.saveOrUpdate(projectBaseInfoDO);
  175 + //在这里进行操作记录。
  176 + ProjectBaseInfoVO projectBaseInfoVO = buildProjectBaseInfoVO(vo, projectBaseInfoDO.getId());
  177 + ProjectBaseDevelopOptLogDO projectOptLogDO = buildProjectOptLogDo(projectNoPrefix, dataScope.getLoginUserId(),type ,operationDesc,JSONObject.toJSONString(projectBaseInfoVO));
  178 + return ServerResult.success(projectBaseDevelopOptLogService.save(projectOptLogDO));
131 } 179 }
132 180
133 @Override 181 @Override
134 public ServerResult applyEditFileds(ProjectBaseInfoLockFieldVO vo) { 182 public ServerResult applyEditFileds(ProjectBaseInfoLockFieldVO vo) {
  183 + Integer applyType=null;
135 List<ProjectApplyDO> applyDOS = projectFieldLockApplyService.list(new LambdaQueryWrapper<ProjectApplyDO>() 184 List<ProjectApplyDO> applyDOS = projectFieldLockApplyService.list(new LambdaQueryWrapper<ProjectApplyDO>()
136 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) 185 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
137 .eq(ProjectApplyDO::getType, vo.getType()) 186 .eq(ProjectApplyDO::getType, vo.getType())
@@ -160,6 +209,15 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -160,6 +209,15 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
160 .status(ApplyStatusEnum.WAIT_AUDIT.getStatus()) 209 .status(ApplyStatusEnum.WAIT_AUDIT.getStatus())
161 .build(); 210 .build();
162 projectFieldLockApplyService.save(build); 211 projectFieldLockApplyService.save(build);
  212 + //进行审批记录的保存。 需要前端在申请字段申请时传递这条数据的id。
  213 + if(ProjectApplyTypeEnum.FIELD_EDIT_APPLY.name().equals(vo.getType())){
  214 + applyType=ProjectApplyTypeEnum.FIELD_EDIT_APPLY.getType();
  215 + }else{
  216 + applyType=ProjectApplyTypeEnum.INNER_PROFIT_FIELD_EDIT_APPLY.getType();
  217 + }
  218 + String descByName = ProjectApplyTypeEnum.getDescByName(vo.getType());
  219 +// ProjectBaseInfoLockFieldVO projectBaseInfoLockFieldVO = buildProjectBaseInfoLockFieldVO(vo);
  220 + projectBaseDevelopOptLogService.save(buildProjectOptLogDo(vo.getProjectNoPrefix(), dataScope.getLoginUserId(),applyType,ProjectApplyTypeEnum.getDescByName(vo.getType()),JSONObject.toJSONString(projectBaseInfoLockFieldVO)));
163 return ServerResult.success(); 221 return ServerResult.success();
164 } 222 }
165 223
@@ -388,6 +446,15 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -388,6 +446,15 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
388 throw new RuntimeException(e); 446 throw new RuntimeException(e);
389 } 447 }
390 })); 448 }));
  449 + //查询永久已保存的配置。
  450 + List<ProjectBaseAfterReviewSettingDO> projectBaseAfterReviewSettingDOS = projectBaseAfterReviewSettingService.list(new LambdaQueryWrapper<ProjectBaseAfterReviewSettingDO>()
  451 + .eq(ProjectBaseAfterReviewSettingDO::getType, ProjectBaseSettingTypeEnum.FIXED_COST_OF_PRODUCTION_DEPARTMENT.getType())
  452 + .in(ProjectBaseAfterReviewSettingDO::getProjectNoPrefix, orderInfoResultVOS.stream()
  453 + .map(OrderBaseInfoVO::getProjectNo)
  454 + .collect(Collectors.toSet())));
  455 + Map<String, ProjectBaseAfterReviewSettingDO> projectBaseAfterReviewSettingDOMap = projectBaseAfterReviewSettingDOS
  456 + .stream()
  457 + .collect(Collectors.toMap(ProjectBaseAfterReviewSettingDO::getProjectNoPrefix, Function.identity(), (x, y) -> x));
391 return orderBaseInfoDOSGroupByProjectNoPre.entrySet().stream().map(entry -> { 458 return orderBaseInfoDOSGroupByProjectNoPre.entrySet().stream().map(entry -> {
392 ProjectBaseInfoDO projectBaseInfoDO = no2ProjectInfoMap.get(entry.getKey()); 459 ProjectBaseInfoDO projectBaseInfoDO = no2ProjectInfoMap.get(entry.getKey());
393 List<OrderInfoResultVO> details = entry.getValue(); 460 List<OrderInfoResultVO> details = entry.getValue();
@@ -402,6 +469,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -402,6 +469,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
402 InnerProfitInfoVO innerProfitInfoVO = InnerProfitInfoVO.builder() 469 InnerProfitInfoVO innerProfitInfoVO = InnerProfitInfoVO.builder()
403 .customerCode(details.get(0).getCustomerCode()) 470 .customerCode(details.get(0).getCustomerCode())
404 .projectNoPrefix(entry.getKey()) 471 .projectNoPrefix(entry.getKey())
  472 + .innerProductionStatus((Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getInnerProductionStatus())) ? ProfitStatusEnum.Not_COMPLETED.getStatus() : projectBaseInfoDO.getInnerProductionStatus() )
405 .productionDepartment(details.get(0).getProductionDepartment()) 473 .productionDepartment(details.get(0).getProductionDepartment())
406 .lockFields(lockFields) 474 .lockFields(lockFields)
407 .build(); 475 .build();
@@ -505,6 +573,11 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -505,6 +573,11 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
505 ratioValue = relation.get("relationValue"); 573 ratioValue = relation.get("relationValue");
506 } 574 }
507 } 575 }
  576 + //在这里进行覆盖
  577 + if(Objects.nonNull(projectBaseAfterReviewSettingDOMap.get(entry.getKey()))){
  578 + fixCostValue=projectBaseAfterReviewSettingDOMap.get(entry.getKey()).getFixedCost().toString();
  579 + ratioValue=projectBaseAfterReviewSettingDOMap.get(entry.getKey()).getCommissionUnitPrice().toString();
  580 + }
508 if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(fixCostValue) 581 if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(fixCostValue)
509 && Objects.nonNull(earliest) 582 && Objects.nonNull(earliest)
510 && Objects.nonNull(latest)) { 583 && Objects.nonNull(latest)) {
@@ -553,6 +626,13 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -553,6 +626,13 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
553 .map(projectNo -> projectNo.substring(0, 8)) 626 .map(projectNo -> projectNo.substring(0, 8))
554 .distinct() 627 .distinct()
555 .collect(Collectors.toList()); 628 .collect(Collectors.toList());
  629 + Map<String, Set<String>> detailProjectNoMap = orderInfoResultVOS.stream()
  630 + .filter(vo -> vo.getProjectNo() != null && vo.getProjectNo().length() >= 8)
  631 + .collect(Collectors.groupingBy(
  632 + vo -> vo.getProjectNo().substring(0, 8), // 按前8位分组
  633 + Collectors.mapping(OrderInfoResultVO::getProjectNo, Collectors.toSet()) // 提取完整projectNo组成List
  634 + ));
  635 +
556 Map<String, List<OrderInfoResultVO>> orderBaseInfoDOSGroupByProjectNoPre = orderInfoResultVOS.stream() 636 Map<String, List<OrderInfoResultVO>> orderBaseInfoDOSGroupByProjectNoPre = orderInfoResultVOS.stream()
557 .collect(Collectors.groupingBy( 637 .collect(Collectors.groupingBy(
558 order -> order.getProjectNo().substring(0, 8) 638 order -> order.getProjectNo().substring(0, 8)
@@ -606,12 +686,21 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -606,12 +686,21 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
606 } 686 }
607 })); 687 }));
608 BigDecimal exchangeRate = systemSettingService.getExchangeRate(); 688 BigDecimal exchangeRate = systemSettingService.getExchangeRate();
  689 + //查询永久已保存的配置。
  690 + List<ProjectBaseAfterReviewSettingDO> projectBaseAfterReviewSettingDOS = projectBaseAfterReviewSettingService.list(new LambdaQueryWrapper<ProjectBaseAfterReviewSettingDO>()
  691 + .eq(ProjectBaseAfterReviewSettingDO::getType, ProjectBaseSettingTypeEnum.COMMISSION_COST.getType())
  692 + .in(ProjectBaseAfterReviewSettingDO::getProjectNoPrefix,projectNoPrefix));
  693 + Map<String, ProjectBaseAfterReviewSettingDO> projectBaseAfterReviewSettingDOMap = projectBaseAfterReviewSettingDOS.stream().collect(Collectors.toMap(ProjectBaseAfterReviewSettingDO::getProjectNoPrefix, Function.identity(), (x, y) -> x));
609 return orderBaseInfoDOSGroupByProjectNoPre.entrySet().stream().map(entry -> { 694 return orderBaseInfoDOSGroupByProjectNoPre.entrySet().stream().map(entry -> {
610 List<OrderInfoResultVO> details = entry.getValue(); 695 List<OrderInfoResultVO> details = entry.getValue();
611 ProjectBaseInfoDO projectBaseInfoDO = noPrefix2ProjectProfitAnalysisDOMap.get(entry.getKey()); 696 ProjectBaseInfoDO projectBaseInfoDO = noPrefix2ProjectProfitAnalysisDOMap.get(entry.getKey());
612 BusinessProfitInfoVO businessProfitInfoVO = BusinessProfitInfoVO.builder() 697 BusinessProfitInfoVO businessProfitInfoVO = BusinessProfitInfoVO.builder()
613 .customerCode(details.get(0).getCustomerCode()) 698 .customerCode(details.get(0).getCustomerCode())
614 .projectNoPrefix(entry.getKey()) 699 .projectNoPrefix(entry.getKey())
  700 + //设置完整的项目号,用于后面需要那这个完整的项目号传递值由前段给后端,因为没有id,所以无法直接知道是哪一条数据,所以需要具体的完整项目号。
  701 + .detailProjectNo(detailProjectNoMap.get(entry.getKey()))
  702 + //返回状态。
  703 + .developmentStatus((Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getDevelopmentStatus())) ? ProfitStatusEnum.Not_COMPLETED.getStatus() : projectBaseInfoDO.getDevelopmentStatus())
615 .lockFields(Optional.ofNullable(prjectNo2LockRecordMap.get(entry.getKey())).orElse(ProjectBaseInfoLockFieldVO.builder() 704 .lockFields(Optional.ofNullable(prjectNo2LockRecordMap.get(entry.getKey())).orElse(ProjectBaseInfoLockFieldVO.builder()
616 .actualExchangeRate(Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getActualExchangeRate()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name()) 705 .actualExchangeRate(Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getActualExchangeRate()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
617 .developmentCopyRmbTotalPrice(Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getDevelopmentCopyRmbTotalPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name()) 706 .developmentCopyRmbTotalPrice(Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getDevelopmentCopyRmbTotalPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
@@ -749,6 +838,12 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -749,6 +838,12 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
749 spainRatio = relation.get("relationValue"); 838 spainRatio = relation.get("relationValue");
750 } 839 }
751 } 840 }
  841 + //在这里进行判断,能够对上述的配置进行覆盖,如果永久已保存的配置中包含这个项目号的数据,则采用永久已保存的配置中,否则采用当前配置(对于已审核的数据,如果采用当前配置肯定会出错。)。
  842 + if(Objects.nonNull(projectBaseAfterReviewSettingDOMap.get(entry.getKey()))){
  843 + fixCostValue=projectBaseAfterReviewSettingDOMap.get(entry.getKey()).getFixedCost().toString();
  844 + ratio=projectBaseAfterReviewSettingDOMap.get(entry.getKey()).getCommissionRate().toString();
  845 + spainRatio=projectBaseAfterReviewSettingDOMap.get(entry.getKey()).getSpainCommissionRate().toString();
  846 + }
752 //固定成本 847 //固定成本
753 businessProfitInfoVO.setFixedCost(BigDecimal.valueOf((between + 1) * Double.parseDouble(fixCostValue)).setScale(2, RoundingMode.HALF_UP)); 848 businessProfitInfoVO.setFixedCost(BigDecimal.valueOf((between + 1) * Double.parseDouble(fixCostValue)).setScale(2, RoundingMode.HALF_UP));
754 if (Objects.nonNull(spainRatio) 849 if (Objects.nonNull(spainRatio)
@@ -812,7 +907,8 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -812,7 +907,8 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
812 } 907 }
813 //综合收益 908 //综合收益
814 businessProfitInfoVO.setComprehensiveProfit(Optional.ofNullable(businessProfitInfoVO.getDevelopmentProfit()).orElse(BigDecimal.ZERO) 909 businessProfitInfoVO.setComprehensiveProfit(Optional.ofNullable(businessProfitInfoVO.getDevelopmentProfit()).orElse(BigDecimal.ZERO)
815 - .add(Optional.ofNullable(businessProfitInfoVO.getExchangeRateProfit()).orElse(BigDecimal.ZERO)) 910 + //综合收益不需要汇率收益计算。
  911 +// .add(Optional.ofNullable(businessProfitInfoVO.getExchangeRateProfit()).orElse(BigDecimal.ZERO))
816 .add(Optional.ofNullable(businessProfitInfoVO.getActualOrderRmbPrice()).orElse(BigDecimal.ZERO)).setScale(2, RoundingMode.HALF_UP)); 912 .add(Optional.ofNullable(businessProfitInfoVO.getActualOrderRmbPrice()).orElse(BigDecimal.ZERO)).setScale(2, RoundingMode.HALF_UP));
817 return businessProfitInfoVO; 913 return businessProfitInfoVO;
818 }).collect(Collectors.toList()); 914 }).collect(Collectors.toList());
@@ -925,15 +1021,16 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -925,15 +1021,16 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
925 .orElse(BigDecimal.valueOf(0)) 1021 .orElse(BigDecimal.valueOf(0))
926 .divide(BigDecimal.valueOf(totalPrice), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)) + "%").orElse("-")); 1022 .divide(BigDecimal.valueOf(totalPrice), 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)) + "%").orElse("-"));
927 createMergedRow(sheet, cellStyle, 48, 49, 7, 9, ""); 1023 createMergedRow(sheet, cellStyle, 48, 49, 7, 9, "");
928 - createMergedRow(sheet, cellStyle, 50, 51, 0, 4, "实际汇率");  
929 - createMergedRow(sheet, cellStyle, 50, 51, 5, 6, Optional.ofNullable(businessProfitInfoVO.getActualExchangeRate()).map(String::valueOf).orElse("-")); 1024 + //导出不再需要实际汇率和汇率收益
  1025 +// createMergedRow(sheet, cellStyle, 50, 51, 0, 4, "实际汇率");
  1026 +// createMergedRow(sheet, cellStyle, 50, 51, 5, 6, Optional.ofNullable(businessProfitInfoVO.getActualExchangeRate()).map(String::valueOf).orElse("-"));
  1027 +// createMergedRow(sheet, cellStyle, 50, 51, 7, 9, "");
  1028 +// createMergedRow(sheet, cellStyle, 52, 53, 0, 4, "汇率收益");
  1029 +// createMergedRow(sheet, cellStyle, 52, 53, 5, 6, Optional.ofNullable(businessProfitInfoVO.getExchangeRateProfit()).map(price -> "¥" + price).orElse("-"));
  1030 +// createMergedRow(sheet, cellStyle, 52, 53, 7, 9, "");
  1031 + createMergedRow(sheet, cellStyle, 50, 51, 0, 4, "综合收益");
  1032 + createMergedRow(sheet, cellStyle, 50, 51, 5, 6, Optional.ofNullable(businessProfitInfoVO.getComprehensiveProfit()).map(price -> "¥" + price).orElse("-"));
930 createMergedRow(sheet, cellStyle, 50, 51, 7, 9, ""); 1033 createMergedRow(sheet, cellStyle, 50, 51, 7, 9, "");
931 - createMergedRow(sheet, cellStyle, 52, 53, 0, 4, "汇率收益");  
932 - createMergedRow(sheet, cellStyle, 52, 53, 5, 6, Optional.ofNullable(businessProfitInfoVO.getExchangeRateProfit()).map(price -> "¥" + price).orElse("-"));  
933 - createMergedRow(sheet, cellStyle, 52, 53, 7, 9, "");  
934 - createMergedRow(sheet, cellStyle, 54, 55, 0, 4, "综合收益");  
935 - createMergedRow(sheet, cellStyle, 54, 55, 5, 6, Optional.ofNullable(businessProfitInfoVO.getComprehensiveProfit()).map(price -> "¥" + price).orElse("-"));  
936 - createMergedRow(sheet, cellStyle, 54, 55, 7, 9, "");  
937 1034
938 // 设置响应头 1035 // 设置响应头
939 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 1036 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
@@ -954,6 +1051,173 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -954,6 +1051,173 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
954 exportInnerProfitExcel(response, ProfitInfoVO); 1051 exportInnerProfitExcel(response, ProfitInfoVO);
955 } 1052 }
956 1053
  1054 + @Override
  1055 + public void exportBusinessProfitExcel(HttpServletResponse response, ProjectBaseInfoQueryVO queryVO) throws Exception {
  1056 + //这里设置为100是故意设置大一点,防止导出多条数据。
  1057 + ServerResult serverResult =listBusinessProfitInfoByPage(OrderBaseInfoQueryVO.builder().page(1).pageSize(100).projectNo(queryVO.getDetailProjectNo()).build());
  1058 + Page<BusinessProfitInfoVO> page = (Page<BusinessProfitInfoVO>) serverResult.getData();
  1059 + List<BusinessProfitInfoVO> businessProfitInfoVOS = page.getRecords();
  1060 + if(CollectionUtils.isNotEmpty(businessProfitInfoVOS)){
  1061 + List<Map<String, Object>> list = buildExportExcel(businessProfitInfoVOS, queryVO);
  1062 + if(CollectionUtils.isNotEmpty(list)){
  1063 + List<String> keys = new ArrayList<>(list.get(Constant.ZERO).keySet());
  1064 + ExcelHelper.opsExport(PoiWorkbookType.XLSX)
  1065 + .opsSheet(list)
  1066 + .opsHeader().simple().texts(keys).done()
  1067 + .opsColumn().fields(keys).done()
  1068 + .height(CellPosition.CELL, 750)
  1069 + .done()
  1070 + .export(response.getOutputStream());
  1071 + }
  1072 + }
  1073 + }
  1074 +
  1075 + @Override
  1076 + public void exportInnerProfitInfoExcel(HttpServletResponse response, ProjectBaseInfoQueryVO queryVO) throws Exception {
  1077 + //这里设置为100是故意设置大一点,防止导出多条数据。
  1078 + ServerResult serverResult = listInnerProfitInfoByPage(OrderBaseInfoQueryVO.builder().page(1).pageSize(100).productionDepartment(Collections.singletonList("内部")).projectNo(queryVO.getDetailProjectNo()).build());
  1079 + Page<InnerProfitInfoVO> page = (Page<InnerProfitInfoVO>) serverResult.getData();
  1080 + List<InnerProfitInfoVO> profitInfoVOS = page.getRecords();
  1081 + if(CollectionUtils.isNotEmpty(profitInfoVOS)){
  1082 + List<Map<String,Object>> list=buildInnerProfitExportExcel(profitInfoVOS, queryVO);
  1083 + if(CollectionUtils.isNotEmpty(list)){
  1084 + List<String> keys = new ArrayList<>(list.get(Constant.ZERO).keySet());
  1085 + ExcelHelper.opsExport(PoiWorkbookType.XLSX)
  1086 + .opsSheet(list)
  1087 + .opsHeader().simple().texts(keys).done()
  1088 + .opsColumn().fields(keys).done()
  1089 + .height(CellPosition.CELL, 750)
  1090 + .done()
  1091 + .export(response.getOutputStream());
  1092 + }
  1093 + }
  1094 + }
  1095 +
  1096 + @Override
  1097 + public void setProjectBaseInfoDevelopmentStatus(OrderBaseInfoVO vo) {
  1098 +
  1099 + //中国团队提成比例。
  1100 + String chainRatio = null;
  1101 + //西班牙提成比例。
  1102 + String spainRatio = null;
  1103 + //固定成本。
  1104 + String dailyCost = null;
  1105 +
  1106 + //去表中设置状态,然后记录数据到永久配置中。
  1107 + if(StringUtils.isBlank(vo.getProjectNo())){
  1108 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  1109 + }
  1110 + ProjectBaseInfoDO projectBaseInfoDO = getOne(new LambdaQueryWrapper<ProjectBaseInfoDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  1111 + .eq(ProjectBaseInfoDO::getProjectNoPrefix, vo.getProjectNo())
  1112 + .last("limit 1"));
  1113 + if(Objects.isNull(projectBaseInfoDO)){
  1114 + throw new BusinessException(ServerResultCode.EMPTY_LIST);
  1115 + }
  1116 + projectBaseInfoDO.setDevelopmentStatus(ProfitStatusEnum.APPROVED.getStatus());
  1117 + //把审核通过时的计算数据时的系统配置保存到永久配置中。防止后续更改系统配置后,正确的数据会被更新掉。
  1118 + //获取当前的系统配置。
  1119 + ProjectBaseAfterReviewSettingDO projectBaseAfterReviewSettingDO = projectBaseAfterReviewSettingService.getOne(new LambdaQueryWrapper<ProjectBaseAfterReviewSettingDO>()
  1120 + .eq(ProjectBaseAfterReviewSettingDO::getProjectNoPrefix, vo.getProjectNo())
  1121 + .eq(ProjectBaseAfterReviewSettingDO::getType, ProjectBaseSettingTypeEnum.COMMISSION_COST.getType())
  1122 + .last("limit 1"));
  1123 + SystemSettingDO systemSettingDO = systemSettingService.getOne(new LambdaQueryWrapper<SystemSettingDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  1124 + .eq(SystemSettingDO::getSettingValue, vo.getCustomerCode())
  1125 + .eq(SystemSettingDO::getRelationCode, "costSettingItem"));
  1126 + if(Objects.isNull(systemSettingDO) || StringUtils.isBlank(systemSettingDO.getRelationValue())){
  1127 + throw new BusinessException("该项目编号的提成配置未配置,请先配置提成配置。");
  1128 + }
  1129 + //json反序列化。
  1130 + List<CostSettingItemVO> costSettingItemVOList = JSONObject.parseObject(systemSettingDO.getRelationValue(), new TypeReference<List<CostSettingItemVO>>() {});
  1131 + if( CollectionUtils.isNotEmpty(costSettingItemVOList)){
  1132 + for (CostSettingItemVO relation : costSettingItemVOList) {
  1133 + if ("ratio".equals(relation.getRelationCode())) {
  1134 + chainRatio = relation.getRelationValue();
  1135 + }if ("spainRatio".equals(relation.getRelationCode())) {
  1136 + spainRatio = relation.getRelationValue();
  1137 + }if("fixCost".equals(relation.getRelationCode())){
  1138 + dailyCost=relation.getRelationValue();
  1139 + }
  1140 + }
  1141 + }
  1142 + if(Objects.isNull(projectBaseAfterReviewSettingDO)){
  1143 + projectBaseAfterReviewSettingDO = projectBaseAfterReviewSettingDO.builder().projectNoPrefix(vo.getProjectNo())
  1144 + .type(ProjectBaseSettingTypeEnum.COMMISSION_COST.getType())
  1145 + .fixedCost(new BigDecimal(dailyCost))
  1146 + .commissionRate(new BigDecimal(chainRatio))
  1147 + .spainCommissionRate(new BigDecimal(spainRatio)).build();
  1148 + }else{
  1149 + projectBaseAfterReviewSettingDO.setProjectNoPrefix(vo.getProjectNo());
  1150 + projectBaseAfterReviewSettingDO.setType(ProjectBaseSettingTypeEnum.COMMISSION_COST.getType());
  1151 + projectBaseAfterReviewSettingDO.setFixedCost(new BigDecimal(dailyCost));
  1152 + projectBaseAfterReviewSettingDO.setCommissionRate(new BigDecimal(chainRatio));
  1153 + projectBaseAfterReviewSettingDO.setSpainCommissionRate(new BigDecimal(spainRatio));
  1154 + }
  1155 + ProjectBaseAfterReviewSettingDO finalProjectBaseAfterReviewSettingDO = projectBaseAfterReviewSettingDO;
  1156 + transactionHelper.run(() -> {
  1157 + projectBaseAfterReviewSettingService.saveOrUpdate(finalProjectBaseAfterReviewSettingDO);
  1158 + updateById(projectBaseInfoDO);
  1159 + });
  1160 + }
  1161 +
  1162 + @Override
  1163 + public void setInnerProductionStatus(OrderBaseInfoVO vo) {
  1164 + String dailyCost = null;
  1165 + String price = null;
  1166 + //去表中设置状态,然后记录数据到永久配置中。
  1167 + if(StringUtils.isBlank(vo.getProjectNo())){
  1168 + throw new BusinessException(ServerResultCode.PARAM_ERROR);
  1169 + }
  1170 + ProjectBaseInfoDO projectBaseInfoDO = getOne(new LambdaQueryWrapper<ProjectBaseInfoDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  1171 + .eq(ProjectBaseInfoDO::getProjectNoPrefix, vo.getProjectNo())
  1172 + .last("limit 1"));
  1173 + if(Objects.isNull(projectBaseInfoDO)){
  1174 + throw new BusinessException(ServerResultCode.EMPTY_LIST);
  1175 + }
  1176 + projectBaseInfoDO.setInnerProductionStatus(ProfitStatusEnum.APPROVED.getStatus());
  1177 + //把审核通过时的计算数据时的系统配置保存到永久配置中。防止后续更改系统配置后,正确的数据会被更新掉。
  1178 + //获取当前的系统配置。
  1179 + ProjectBaseAfterReviewSettingDO projectBaseAfterReviewSettingDO = projectBaseAfterReviewSettingService.getOne(new LambdaQueryWrapper<ProjectBaseAfterReviewSettingDO>()
  1180 + .eq(ProjectBaseAfterReviewSettingDO::getProjectNoPrefix, vo.getProjectNo())
  1181 + .eq(ProjectBaseAfterReviewSettingDO::getType, ProjectBaseSettingTypeEnum.FIXED_COST_OF_PRODUCTION_DEPARTMENT.getType())
  1182 + .last("limit 1"));
  1183 + SystemSettingDO systemSettingDO = systemSettingService.getOne(new LambdaQueryWrapper<SystemSettingDO>().eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  1184 + .eq(SystemSettingDO::getSettingValue, vo.getCustomerCode())
  1185 + .eq(SystemSettingDO::getRelationCode, "ProduceSettingItem"));
  1186 + if(Objects.isNull(systemSettingDO) || StringUtils.isBlank(systemSettingDO.getRelationValue())){
  1187 + throw new BusinessException("该项目编号的提成配置未配置,请先配置提成配置。");
  1188 + }
  1189 + //json反序列化。
  1190 + List<CostSettingItemVO> costSettingItemVOList = JSONObject.parseObject(systemSettingDO.getRelationValue(), new TypeReference<List<CostSettingItemVO>>() {});
  1191 + if( CollectionUtils.isNotEmpty(costSettingItemVOList)){
  1192 + for (CostSettingItemVO relation : costSettingItemVOList) {
  1193 + //这里是系统配置中的得到的,应该是从系统配置中的生产科中得到。 固定成本。
  1194 + if("fixCost".equals(relation.getRelationCode())){
  1195 + dailyCost=relation.getRelationValue();
  1196 + }
  1197 + //生产提成单价
  1198 + if("ratio".equals(relation.getRelationCode())){
  1199 + price=relation.getRelationValue();
  1200 + }
  1201 + }
  1202 + }
  1203 + if(Objects.isNull(projectBaseAfterReviewSettingDO)){
  1204 + projectBaseAfterReviewSettingDO= projectBaseAfterReviewSettingDO.builder().projectNoPrefix(vo.getProjectNo())
  1205 + .type(ProjectBaseSettingTypeEnum.FIXED_COST_OF_PRODUCTION_DEPARTMENT.getType())
  1206 + .fixedCost(new BigDecimal(dailyCost))
  1207 + .commissionUnitPrice(new BigDecimal(price)).build();
  1208 + }else{
  1209 + projectBaseAfterReviewSettingDO.setProjectNoPrefix(vo.getProjectNo());
  1210 + projectBaseAfterReviewSettingDO.setType(ProjectBaseSettingTypeEnum.FIXED_COST_OF_PRODUCTION_DEPARTMENT.getType());
  1211 + projectBaseAfterReviewSettingDO.setFixedCost(new BigDecimal(dailyCost));
  1212 + projectBaseAfterReviewSettingDO.setCommissionUnitPrice(new BigDecimal(price));
  1213 + }
  1214 + ProjectBaseAfterReviewSettingDO finalProjectBaseAfterReviewSettingDO = projectBaseAfterReviewSettingDO;
  1215 + transactionHelper.run(() -> {
  1216 + projectBaseAfterReviewSettingService.saveOrUpdate(finalProjectBaseAfterReviewSettingDO);
  1217 + updateById(projectBaseInfoDO);
  1218 + });
  1219 + }
  1220 +
957 public void exportInnerProfitExcel(HttpServletResponse response, InnerProfitInfoVO vo) throws Exception { 1221 public void exportInnerProfitExcel(HttpServletResponse response, InnerProfitInfoVO vo) throws Exception {
958 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 1222 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
959 XSSFWorkbook workbook = new XSSFWorkbook(); 1223 XSSFWorkbook workbook = new XSSFWorkbook();
@@ -1006,12 +1270,12 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -1006,12 +1270,12 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
1006 createMergedRow(sheet, cellStyle, 10, 11, 8, 9, Optional.ofNullable(vo.getOrderCount()).map(String::valueOf).orElse("-")); 1270 createMergedRow(sheet, cellStyle, 10, 11, 8, 9, Optional.ofNullable(vo.getOrderCount()).map(String::valueOf).orElse("-"));
1007 1271
1008 // 第五部分:预算与实际 1272 // 第五部分:预算与实际
1009 - createMergedRow(sheet, cellStyle, 12, 13, 0, 3, "生产科预算金额"); 1273 + createMergedRow(sheet, cellStyle, 12, 13, 0, 3, "生产科预算金额");
1010 createMergedRow(sheet, cellStyle, 12, 13, 4, 5, "¥" + Optional.ofNullable(vo.getProductionDepartmentPredictPrice()).map(String::valueOf).orElse("-")); 1274 createMergedRow(sheet, cellStyle, 12, 13, 4, 5, "¥" + Optional.ofNullable(vo.getProductionDepartmentPredictPrice()).map(String::valueOf).orElse("-"));
1011 createMergedRow(sheet, cellStyle, 12, 13, 6, 7, "预算占比"); 1275 createMergedRow(sheet, cellStyle, 12, 13, 6, 7, "预算占比");
1012 createMergedRow(sheet, cellStyle, 12, 13, 8, 9, "预算占比与实际占比差"); 1276 createMergedRow(sheet, cellStyle, 12, 13, 8, 9, "预算占比与实际占比差");
1013 1277
1014 - createMergedRow(sheet, cellStyle, 14, 15, 0, 3, "实际发生费用"); 1278 + createMergedRow(sheet, cellStyle, 14, 15, 0, 3, "生产科实际花费总金额");
1015 createMergedRow(sheet, cellStyle, 14, 15, 4, 5, "¥" + Optional.ofNullable(vo.getProductionActualPrice()).orElse(BigDecimal.ZERO)); 1279 createMergedRow(sheet, cellStyle, 14, 15, 4, 5, "¥" + Optional.ofNullable(vo.getProductionActualPrice()).orElse(BigDecimal.ZERO));
1016 createMergedRow(sheet, cellStyle, 14, 15, 6, 7, Optional.ofNullable(vo.getPredictRatio()).map(r -> r.multiply(BigDecimal.valueOf(100)) + "%").orElse("-")); 1280 createMergedRow(sheet, cellStyle, 14, 15, 6, 7, Optional.ofNullable(vo.getPredictRatio()).map(r -> r.multiply(BigDecimal.valueOf(100)) + "%").orElse("-"));
1017 createMergedRow(sheet, cellStyle, 14, 15, 8, 9, Optional.ofNullable(vo.getPredictAndActualRatio()).map(r -> r.multiply(BigDecimal.valueOf(100)) + "%").orElse("-")); 1281 createMergedRow(sheet, cellStyle, 14, 15, 8, 9, Optional.ofNullable(vo.getPredictAndActualRatio()).map(r -> r.multiply(BigDecimal.valueOf(100)) + "%").orElse("-"));
@@ -1069,5 +1333,121 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -1069,5 +1333,121 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
1069 } 1333 }
1070 sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, startCol, endCol)); 1334 sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, startCol, endCol));
1071 } 1335 }
  1336 + private ProjectBaseDevelopOptLogDO buildProjectOptLogDo(String projectNoPrefix, Long userId , Integer type,String optType, String field){
  1337 + return ProjectBaseDevelopOptLogDO.builder()
  1338 + .projectNoPrefix(projectNoPrefix)
  1339 + .userId(userId)
  1340 + .type(type)
  1341 + .optType(optType)
  1342 + .fields(field)
  1343 + .build();
  1344 + }
  1345 + private ProjectBaseInfoVO buildProjectBaseInfoVO(ProjectBaseInfoVO vo,Long projectBaseInfoId){
  1346 + ProjectBaseInfoVO projectBaseInfoVO = new ProjectBaseInfoVO();
  1347 + BeanUtils.copyProperties(vo, projectBaseInfoVO, "id");
  1348 + projectBaseInfoVO.setId(projectBaseInfoId);
  1349 + return projectBaseInfoVO;
  1350 + }
  1351 +// private ProjectBaseInfoLockFieldVO buildProjectBaseInfoLockFieldVO(ProjectBaseInfoLockFieldVO vo){
  1352 +// ProjectBaseInfoLockFieldVO projectBaseInfoLockFieldVO = new ProjectBaseInfoLockFieldVO();
  1353 +// if(OrderLockFieldEnum.UN_LOCKED.equals(vo.getActualExchangeRate())){
  1354 +// projectBaseInfoLockFieldVO.setActualExchangeRate(OrderLockFieldEnum.UN_LOCKED.getStatus());
  1355 +// }
  1356 +// if(OrderLockFieldEnum.UN_LOCKED.equals(vo.getDevelopmentCopyRmbTotalPrice())){
  1357 +// projectBaseInfoLockFieldVO.setDevelopmentCopyRmbTotalPrice(OrderLockFieldEnum.UN_LOCKED.getStatus());
  1358 +// }
  1359 +// if(OrderLockFieldEnum.UN_LOCKED.equals(vo.getPaidRmbCommission())){
  1360 +// projectBaseInfoLockFieldVO.setPaidRmbCommission(OrderLockFieldEnum.UN_LOCKED.getStatus());
  1361 +// }
  1362 +// if(OrderLockFieldEnum.UN_LOCKED.equals(vo.getProjectEndTime())){
  1363 +// projectBaseInfoLockFieldVO.setProjectEndTime(OrderLockFieldEnum.UN_LOCKED.getStatus());
  1364 +// }
  1365 +// if(OrderLockFieldEnum.UN_LOCKED.equals(vo.getProjectStartTime())){
  1366 +// projectBaseInfoLockFieldVO.setProjectStartTime(OrderLockFieldEnum.UN_LOCKED.getStatus());
  1367 +// }
  1368 +// if(OrderLockFieldEnum.UN_LOCKED.equals(vo.getSpainPaidRmbCommission())){
  1369 +// projectBaseInfoLockFieldVO.setSpainPaidRmbCommission(OrderLockFieldEnum.UN_LOCKED.getStatus());
  1370 +// }
  1371 +// return projectBaseInfoLockFieldVO;
  1372 +// }
  1373 + private List<Map<String,Object>> buildExportExcel(List<BusinessProfitInfoVO> businessProfitInfoVOList,ProjectBaseInfoQueryVO queryVO){
  1374 + List<Map<String,Object>> list = new ArrayList<>();
  1375 + for( BusinessProfitInfoVO vo:businessProfitInfoVOList){
  1376 + Map<String, Object> hashMap = new LinkedHashMap<>();
  1377 + hashMap.put("客户编码",Objects.nonNull(vo.getCustomerCode()) ? vo.getCustomerCode() : "");
  1378 + hashMap.put("项目号",Objects.nonNull(vo.getProjectNoPrefix()) ? vo.getProjectNoPrefix() : "");
  1379 + hashMap.put("客户总金额¥",Objects.nonNull(vo.getCustomerRmbTotalPrice()) ? String.format("%.2f",vo.getCustomerRmbTotalPrice()) : "");
  1380 + hashMap.put("客户总金额$",Objects.nonNull(vo.getCustomerTotalPrice()) ? String.format("%.2f",vo.getCustomerTotalPrice()) : "");
  1381 + hashMap.put("生产总价合计¥",Objects.nonNull(vo.getProductionDepartmentTotalPrice()) ? String.format("%.2f",vo.getProductionDepartmentTotalPrice()) : "");
  1382 + hashMap.put("包装费用合计¥",Objects.nonNull(vo.getPacketRmbTotalPrice()) ? String.format("%.2f",vo.getPacketRmbTotalPrice()) : "");
  1383 + hashMap.put("包装费用合计$",Objects.nonNull(vo.getPacketTotalPrice()) ? String.format("%.2f",vo.getPacketTotalPrice()) : "");
  1384 + hashMap.put("研发复制合计¥",Objects.nonNull(vo.getDevelopmentCopyRmbTotalPrice()) ? vo.getDevelopmentCopyRmbTotalPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1385 + hashMap.put("固定成本¥",Objects.nonNull(vo.getFixedCost()) ? vo.getFixedCost().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1386 + hashMap.put("西班牙提成¥",Objects.nonNull(vo.getSpainRmbCommission()) ? vo.getSpainRmbCommission().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1387 + hashMap.put("西班牙已发提成¥",Objects.nonNull(vo.getSpainPaidRmbCommission()) ? vo.getSpainPaidRmbCommission().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1388 + hashMap.put("西班牙未发提成¥",Objects.nonNull(vo.getSpainUnpaidRmbCommission()) ? vo.getSpainUnpaidRmbCommission().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1389 + hashMap.put("中国团队提成¥",Objects.nonNull(vo.getRmbCommission()) ? vo.getRmbCommission().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1390 + hashMap.put("中国已发提成¥",Objects.nonNull(vo.getPaidRmbCommission()) ? vo.getPaidRmbCommission().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1391 + hashMap.put("中国未发提成¥",Objects.nonNull(vo.getUnpaidRmbCommission()) ? vo.getUnpaidRmbCommission().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1392 + hashMap.put("支出合计¥",Objects.nonNull(vo.getRmbTotalExpense()) ? vo.getRmbTotalExpense().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1393 + hashMap.put("毛利润¥",Objects.nonNull(vo.getProfit()) ? vo.getProfit().setScale(2, RoundingMode.HALF_UP).toPlainString(): "");
  1394 + hashMap.put("毛利率",
  1395 + Objects.nonNull(vo.getProfitRate())
  1396 + ? vo.getProfitRate().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toPlainString() + "%"
  1397 + : ""
  1398 + );
  1399 + hashMap.put("研发贸易净利润¥",Objects.nonNull(vo.getDevelopmentProfit()) ? vo.getDevelopmentProfit().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1400 + hashMap.put("净利润率",
  1401 + Objects.nonNull(vo.getDevelopmentProfitRate())
  1402 + ? vo.getDevelopmentProfitRate().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%"
  1403 + : ""
  1404 + );
  1405 + hashMap.put("包装费用合计¥",Objects.nonNull(vo.getPacketRmbTotalPrice()) ? String.format("%.2f",vo.getPacketRmbTotalPrice()) : "");
  1406 + hashMap.put("包装费用实际金额¥",Objects.nonNull(vo.getPacketActualRmbPrice()) ? vo.getPacketActualRmbPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1407 + hashMap.put("订单总数量",Objects.nonNull(vo.getOrderCount()) ? vo.getOrderCount() : "");
  1408 + hashMap.put("实际跟单单价¥",Objects.nonNull(vo.getActualOrderRmbPrice()) ? vo.getActualOrderRmbPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1409 + hashMap.put("实际跟单单价$",Objects.nonNull(vo.getActualOrderPrice()) ? vo.getActualOrderPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1410 + hashMap.put("包装费用收益¥",Objects.nonNull(vo.getPacketProfitRmbPrice()) ? vo.getPacketProfitRmbPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1411 + hashMap.put("综合收益¥",Objects.nonNull(vo.getComprehensiveProfit()) ? vo.getComprehensiveProfit().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1412 +// if(StringUtils.isNotBlank(queryVO.getProjectExportSelect().getSpainPaidRmbCommission()) &&
  1413 +// OrderLockFieldEnum.SELECTED.name().equals(queryVO.getProjectExportSelect().getSpainPaidRmbCommission())){
  1414 +// }
  1415 + list.add(hashMap);
  1416 + }
  1417 + return list;
  1418 + }
1072 1419
  1420 + private List<Map<String,Object>> buildInnerProfitExportExcel(List<InnerProfitInfoVO> innerProfitInfoVOList, ProjectBaseInfoQueryVO queryVO) {
  1421 + List<Map<String,Object>> list = new ArrayList<>();
  1422 + for (InnerProfitInfoVO vo:innerProfitInfoVOList){
  1423 + Map<String, Object> map = new LinkedHashMap<>();
  1424 + map.put("客户编码",Objects.nonNull(vo.getCustomerCode()) ? vo.getCustomerCode() : "");
  1425 + map.put("项目号",Objects.nonNull(vo.getProjectNoPrefix()) ? vo.getProjectNoPrefix() : "");
  1426 + map.put("生产科",Objects.nonNull(vo.getProductionDepartment()) ? vo.getProductionDepartment() : "");
  1427 + map.put("数量",Objects.nonNull(vo.getOrderCount()) ? vo.getOrderCount() : "");
  1428 + map.put("生产科总价¥",Objects.nonNull(vo.getProductionDepartmentTotalPrice()) ? String.format("%.2f",vo.getProductionDepartmentTotalPrice()) : "");
  1429 + map.put("生产科预算金额¥",Objects.nonNull(vo.getProductionDepartmentPredictPrice()) ? vo.getProductionDepartmentPredictPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1430 + map.put("实际发生费用¥",Objects.nonNull(vo.getProductionActualPrice()) ? vo.getProductionActualPrice().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1431 + map.put("预算占比",Objects.nonNull(vo.getPredictRatio()) ? vo.getPredictRatio().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1432 + map.put("预算占比与实际占比差",
  1433 + Objects.nonNull(vo.getPredictAndActualRatio())
  1434 + ? vo.getPredictAndActualRatio().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%"
  1435 + : ""
  1436 + );
  1437 + map.put("事前毛利润¥",Objects.nonNull(vo.getBeforeGrossProfit()) ? vo.getBeforeGrossProfit().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1438 + map.put("事前毛利润率",Objects.nonNull(vo.getBeforeGrossProfitRate()) ? vo.getBeforeGrossProfitRate().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%" : "");
  1439 + map.put("事后毛利润¥",Objects.nonNull(vo.getGrossProfit()) ? vo.getGrossProfit().setScale(2, RoundingMode.HALF_UP).toPlainString() : "");
  1440 + map.put("事后毛利润率",Objects.nonNull(vo.getGrossProfitRate()) ? vo.getGrossProfitRate().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%" : "");
  1441 + map.put("内部生产固定成本¥",Objects.nonNull(vo.getInnerProductionFixedCost()) ? vo.getInnerProductionFixedCost().setScale(2, RoundingMode.HALF_UP) : "");
  1442 + map.put("内部生产提成¥",Objects.nonNull(vo.getInnerProductionCommission()) ? vo.getInnerProductionCommission().setScale(2, RoundingMode.HALF_UP) : "");
  1443 + map.put("内部生产净利润¥",Objects.nonNull(vo.getInnerProductionProfit()) ? vo.getInnerProductionProfit().setScale(2, RoundingMode.HALF_UP) : "");
  1444 + map.put("内部生产净利润率",Objects.nonNull(vo.getInnerProductionProfitRate()) ? vo.getInnerProductionProfitRate().multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP) + "%" : "");
  1445 + /* if(StringUtils.isNotEmpty(queryVO.getInnerProfitInfoExportSelect().getProductionDepartmentTotalPrice()) &&
  1446 + OrderLockFieldEnum.SELECTED.name().equals(queryVO.getInnerProfitInfoExportSelect().getProductionDepartmentTotalPrice())){
  1447 +
  1448 + }*/
  1449 + list.add(map);
  1450 + }
  1451 + return list;
  1452 + }
1073 } 1453 }
src/main/resources/application-pre-prod.yml
@@ -57,7 +57,7 @@ spring: @@ -57,7 +57,7 @@ spring:
57 testWhileIdle: true 57 testWhileIdle: true
58 testOnBorrow: true 58 testOnBorrow: true
59 testOnReturn: true 59 testOnReturn: true
60 - password: Erp@test123456 60 + password: eJ8(bD6]wN6=gI5=
61 time-between-eviction-runs-millis: 1000 61 time-between-eviction-runs-millis: 1000
62 url: jdbc:mysql://47.104.8.35:3307/order-erp-pre-prod?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true&useAffectedRows=true&autoReconnectForPools=true 62 url: jdbc:mysql://47.104.8.35:3307/order-erp-pre-prod?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&allowMultiQueries=true&useAffectedRows=true&autoReconnectForPools=true
63 username: root 63 username: root
src/main/resources/application-test.yml
@@ -63,7 +63,7 @@ spring: @@ -63,7 +63,7 @@ spring:
63 username: root 63 username: root
64 redis: 64 redis:
65 database: 0 65 database: 0
66 - host: 39.108.227.113 66 + host: 47.104.8.35
67 lettuce: 67 lettuce:
68 pool: 68 pool:
69 max-active: 2000 69 max-active: 2000
@@ -72,7 +72,7 @@ spring: @@ -72,7 +72,7 @@ spring:
72 min-idle: 3 72 min-idle: 3
73 time-between-eviction-runs: 100 73 time-between-eviction-runs: 100
74 password: '' 74 password: ''
75 - port: 6379 75 + port: 6380
76 timeout: 2000 76 timeout: 2000
77 mail: 77 mail:
78 # 配置 SMTP 服务器地址 78 # 配置 SMTP 服务器地址