Kaynağa Gözat

模块开发2

wwh 2 ay önce
ebeveyn
işleme
5528a9c3c7
29 değiştirilmiş dosya ile 1105 ekleme ve 34 silme
  1. 1 1
      huimv-farm/src/main/java/vip/xiaonuo/money/service/impl/MoneyCostServiceImpl.java
  2. 51 5
      huimv-farm/src/main/java/vip/xiaonuo/production/controller/ProductionWorkstopPlanController.java
  3. 71 0
      huimv-farm/src/main/java/vip/xiaonuo/production/controller/ProductionWritePlanController.java
  4. 78 0
      huimv-farm/src/main/java/vip/xiaonuo/production/entity/ProductionWritePlan.java
  5. 17 0
      huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionLocationVo.java
  6. 15 0
      huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionNameVo.java
  7. 13 0
      huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionPlanDetailVo.java
  8. 15 0
      huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionPlanVo2.java
  9. 17 0
      huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionVo.java
  10. 46 0
      huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionWorkPlanTargetVo.java
  11. 10 0
      huimv-farm/src/main/java/vip/xiaonuo/production/mapper/ProductionWorkstopPlanMapper.java
  12. 16 0
      huimv-farm/src/main/java/vip/xiaonuo/production/mapper/ProductionWritePlanMapper.java
  13. 18 0
      huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionDetailParam.java
  14. 17 0
      huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionPageParam.java
  15. 2 2
      huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionParam.java
  16. 14 0
      huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionScreenParam.java
  17. 37 0
      huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionTargetParam.java
  18. 34 0
      huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionVoParam.java
  19. 69 0
      huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionWritePlanAddParam.java
  20. 43 0
      huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionWritePlanParam.java
  21. 21 2
      huimv-farm/src/main/java/vip/xiaonuo/production/service/IProductionWorkstopPlanService.java
  22. 31 0
      huimv-farm/src/main/java/vip/xiaonuo/production/service/IProductionWritePlanService.java
  23. 48 8
      huimv-farm/src/main/java/vip/xiaonuo/production/service/impl/ProductionTargetServiceImpl.java
  24. 293 6
      huimv-farm/src/main/java/vip/xiaonuo/production/service/impl/ProductionWorkstopPlanServiceImpl.java
  25. 80 0
      huimv-farm/src/main/java/vip/xiaonuo/production/service/impl/ProductionWritePlanServiceImpl.java
  26. 8 6
      huimv-farm/src/main/java/vip/xiaonuo/production/service/impl/ProductionYieldServiceImpl.java
  27. 4 4
      huimv-farm/src/main/java/vip/xiaonuo/sale/service/impl/SaleTargetServiceImpl.java
  28. 31 0
      huimv-farm/src/main/resources/mapper/ProductionWorkstopPlanMapper.xml
  29. 5 0
      huimv-farm/src/main/resources/mapper/ProductionWritePlanMapper.xml

+ 1 - 1
huimv-farm/src/main/java/vip/xiaonuo/money/service/impl/MoneyCostServiceImpl.java

@@ -46,7 +46,7 @@ public class MoneyCostServiceImpl extends ServiceImpl<MoneyCostMapper, MoneyCost
         QueryWrapper<MoneyCost> queryWrapper = new QueryWrapper<>();
         queryWrapper.ge("create_time", currentDateString);
         queryWrapper.eq(StringUtils.isNotBlank(outParam.getOrgId()), "org_id", outParam.getOrgId());
-        queryWrapper.select(" IFNULL(sum(manage),'0') manage,IFNULL(sum(sale),'0') sale,IFNULL(sum(finance),'0') finance," +
+        queryWrapper.select(" IFNULL(sum(manage),'0') manage,convert(IFNULL(sum(sale),'0'),decimal(10,2)) sale,IFNULL(sum(finance),'0') finance," +
                 "create_time createTime");
         queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y-%m')");
         queryWrapper.orderByAsc("create_time");

+ 51 - 5
huimv-farm/src/main/java/vip/xiaonuo/production/controller/ProductionWorkstopPlanController.java

@@ -1,6 +1,8 @@
 package vip.xiaonuo.production.controller;
 
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
 import io.swagger.annotations.Api;
@@ -14,9 +16,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.production.entity.ProductionReceive;
-import vip.xiaonuo.production.entity.vo.ProductionPlanVo;
-import vip.xiaonuo.production.param.ProductionPlanParam;
-import vip.xiaonuo.production.param.ProductionReceiveParam;
+import vip.xiaonuo.production.entity.ProductionWorkstopPlan;
+import vip.xiaonuo.production.entity.vo.*;
+import vip.xiaonuo.production.param.*;
 import vip.xiaonuo.production.service.IProductionWorkstopPlanService;
 
 import java.util.List;
@@ -30,7 +32,6 @@ import java.util.List;
  * @since 2024-12-12
  */
 @RestController
-@RequestMapping("/production-workstop-plan")
 @Api(tags = "生成管控车间计划")
 @ApiSupport(author = "wang", order = 1)
 @Validated
@@ -39,10 +40,55 @@ public class ProductionWorkstopPlanController {
     @Autowired
     private IProductionWorkstopPlanService workstopPlanService;
 
-    @PostMapping("/production-workstop-plan/getList")
+    @PostMapping("/production-work-plan/getList")
     @ApiOperationSupport(order = 1)
     @ApiOperation("生成管控车间计划列表")
     public CommonResult<List<ProductionPlanVo>> getList(@RequestBody ProductionPlanParam planParam) {
         return CommonResult.data(workstopPlanService.getList(planParam));
     }
+
+    @PostMapping("/production-work-plan/getTarget")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("大屏生成与质量指标")
+    public CommonResult<ProductionWorkPlanTargetVo> getTarget(@RequestBody ProductionTargetParam targetParam) {
+        return CommonResult.data(workstopPlanService.getTarget(targetParam));
+    }
+
+
+    @PostMapping("/production-work-plan/getDetail")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("大屏生成与质量指标详情")
+    public CommonResult<List<ProductionPlanDetailVo>> getDetail(@RequestBody ProductionDetailParam detailParam) {
+        return CommonResult.data(workstopPlanService.getDetail(detailParam));
+    }
+
+    @PostMapping("/production-work-plan/listScreen")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("大屏主要产品计划与实际产量")
+    public CommonResult<List<ProductionVo>> listScreen(@RequestBody ProductionScreenParam screenParam) {
+        return CommonResult.data(workstopPlanService.listScreen(screenParam));
+    }
+
+    @PostMapping("/production-work-plan/getTop")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("大屏各车间产品完成率排名top10,包含全部")
+    public CommonResult<IPage<ProductionWorkstopPlan>> getTop(@RequestBody ProductionPageParam pageParam) {
+        return CommonResult.data(workstopPlanService.getTop(pageParam));
+    }
+
+
+    @PostMapping("/production-work-plan/listLocation")
+    @ApiOperationSupport(order = 6)
+    @ApiOperation("车间列表")
+    public CommonResult<List<ProductionLocationVo>> listLocation(@RequestBody ProductionVoParam voParam) {
+        return CommonResult.data(workstopPlanService.listLocation(voParam));
+    }
+
+
+    @PostMapping("/production-work-plan/listProductionName")
+    @ApiOperationSupport(order = 7)
+    @ApiOperation("产品名称列表")
+    public CommonResult<List<ProductionNameVo>> listProductionName(@RequestBody ProductionVoParam voParam) {
+        return CommonResult.data(workstopPlanService.listProductionName(voParam));
+    }
 }

+ 71 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/controller/ProductionWritePlanController.java

@@ -0,0 +1,71 @@
+package vip.xiaonuo.production.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.production.entity.ProductionTarget;
+import vip.xiaonuo.production.entity.ProductionWritePlan;
+import vip.xiaonuo.production.param.ProductionPageParam;
+import vip.xiaonuo.production.param.ProductionParam;
+import vip.xiaonuo.production.param.ProductionWritePlanAddParam;
+import vip.xiaonuo.production.service.IProductionWritePlanService;
+
+import java.text.ParseException;
+import java.util.Map;
+
+/**
+ * <p>
+ * 计划生产量填报 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2025-02-25
+ */
+@RestController
+@Api(tags = "计划生产量填报")
+@ApiSupport(author = "wang", order = 1)
+@Validated
+public class ProductionWritePlanController {
+
+    @Autowired
+    private IProductionWritePlanService planService;
+
+    @PostMapping("/production-write-plan/add")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("计划生产量填报添加")
+    public CommonResult add(@RequestBody ProductionWritePlanAddParam param) throws ParseException {
+        return planService.add(param);
+    }
+
+    @PostMapping("/production-write-plan/edit")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("计划生产量填报修改")
+    public CommonResult edit(@RequestBody ProductionWritePlan writePlan) {
+        return planService.edit(writePlan);
+    }
+
+    @PostMapping("/production-write-plan/delete")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("计划生产量填报删除")
+    public CommonResult delete(@RequestBody Map<String, String> paramsMap) {
+        return planService.delete(paramsMap);
+    }
+
+    @PostMapping("/production-write-plan/page")
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("计划生产量填报分页")
+    public CommonResult<Page<ProductionWritePlan>> page(@RequestBody ProductionPageParam pageParam) {
+        return CommonResult.data(planService.page(pageParam));
+    }
+}

+ 78 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/entity/ProductionWritePlan.java

@@ -0,0 +1,78 @@
+package vip.xiaonuo.production.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 计划生产量填报
+ * </p>
+ *
+ * @author author
+ * @since 2025-02-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("production_write_plan")
+public class ProductionWritePlan implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 计划生产量
+     */
+    @ApiModelProperty(value = "计划生产量",position = 1)
+    private String productionPlan;
+
+    /**
+     * 产品名称
+     */
+    @ApiModelProperty(value = "产品名称",position = 2)
+    private String productionName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间",position = 3)
+    @JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 车间名称
+     */
+    @ApiModelProperty(value = "车间名称",position = 4)
+    private String locationName;
+
+    /**
+     * 车间id
+     */
+    @ApiModelProperty(value = "车间id",position = 5)
+    private String locationId;
+
+    /**
+     * 组织id
+     */
+    @ApiModelProperty(value = "组织id",position = 6)
+    private String orgId;
+
+    /**
+     * 组织id
+     */
+    @ApiModelProperty(value = "公司名称",position = 7)
+    private String orgName;
+
+}

+ 17 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionLocationVo.java

@@ -0,0 +1,17 @@
+package vip.xiaonuo.production.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ProductionLocationVo {
+
+    @ApiModelProperty(value = "车间id",position = 1)
+    private String locationId;
+
+    @ApiModelProperty(value = "车间名称",position = 2)
+    private String locationName;
+
+    @ApiModelProperty(value = "组织id",position = 3)
+    private String orgId;
+}

+ 15 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionNameVo.java

@@ -0,0 +1,15 @@
+package vip.xiaonuo.production.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ProductionNameVo {
+
+    @ApiModelProperty(value = "产品名称",position = 1)
+    private String produceName;
+
+
+    @ApiModelProperty(value = "组织id",position = 2)
+    private String orgId;
+}

+ 13 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionPlanDetailVo.java

@@ -0,0 +1,13 @@
+package vip.xiaonuo.production.entity.vo;
+
+
+import lombok.Data;
+
+@Data
+public class ProductionPlanDetailVo {
+
+    private String values;
+
+    private String createTime;
+
+}

+ 15 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionPlanVo2.java

@@ -0,0 +1,15 @@
+package vip.xiaonuo.production.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ProductionPlanVo2 {
+
+    private String produceName;
+
+    private String monthValue;
+
+    private String lastMonthValue;
+
+}

+ 17 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionVo.java

@@ -0,0 +1,17 @@
+package vip.xiaonuo.production.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ProductionVo {
+
+    @ApiModelProperty(value = "计划产量",position = 1)
+    private String planProduction;
+
+    @ApiModelProperty(value = "实际产量",position = 2)
+    private String actualProduction;
+
+    @ApiModelProperty(value = "时间",position = 3)
+    private String createTime;
+}

+ 46 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/entity/vo/ProductionWorkPlanTargetVo.java

@@ -0,0 +1,46 @@
+package vip.xiaonuo.production.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ProductionWorkPlanTargetVo {
+
+    @ApiModelProperty(value = "饲料级VD3产量",position = 1)
+    private String complete;
+
+    @ApiModelProperty(value = "饲料级VD3产量同比",position = 2)
+    private String completeRate;
+
+    @ApiModelProperty(value = "VD3结晶产量",position = 3)
+    private String visitNum;
+
+    @ApiModelProperty(value = "VD3结晶产量同比",position = 4)
+    private String visitNumRate;
+
+    @ApiModelProperty(value = "胆固醇产量", position = 5)
+    private String saleMoney;
+
+    @ApiModelProperty(value = "胆固醇产量同比", position = 6)
+    private String saleMoneyRate;
+
+    @ApiModelProperty(value = "25羟基D3原产量", position = 7)
+    private String saleDeliverMoney;
+
+    @ApiModelProperty(value = "25羟基D3原产量同比", position = 8)
+    private String saleDeliverMoneyRate;
+
+    @ApiModelProperty(value = "维生素A微粒产量", position = 9)
+    private String receiveMoney;
+
+    @ApiModelProperty(value = "维生素A微粒产量同比", position = 10)
+    private String receiveMoneyRate;
+
+    @ApiModelProperty(value = "能耗费用", position = 11)
+    private String energyMoney;
+
+    @ApiModelProperty(value = "能耗费用同比", position = 12)
+    private String energyMoneyRate;
+}

+ 10 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/mapper/ProductionWorkstopPlanMapper.java

@@ -1,7 +1,14 @@
 package vip.xiaonuo.production.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import vip.xiaonuo.money.entity.MoneyBusiness;
 import vip.xiaonuo.production.entity.ProductionWorkstopPlan;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.production.entity.vo.ProductionPlanVo2;
 
 /**
  * <p>
@@ -13,4 +20,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ProductionWorkstopPlanMapper extends BaseMapper<ProductionWorkstopPlan> {
 
+    ProductionPlanVo2 getTarget(String start,String end,String lastStart,String lastEnd,String orgId,String name);
+
+    IPage<ProductionWorkstopPlan> getTop(@Param(Constants.WRAPPER) QueryWrapper<ProductionWorkstopPlan> wapper,IPage<ProductionWorkstopPlan> page);
 }

+ 16 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/mapper/ProductionWritePlanMapper.java

@@ -0,0 +1,16 @@
+package vip.xiaonuo.production.mapper;
+
+import vip.xiaonuo.production.entity.ProductionWritePlan;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 计划生产量填报 Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2025-02-25
+ */
+public interface ProductionWritePlanMapper extends BaseMapper<ProductionWritePlan> {
+
+}

+ 18 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionDetailParam.java

@@ -0,0 +1,18 @@
+package vip.xiaonuo.production.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.poi.ss.formula.functions.T;
+
+@Data
+public class ProductionDetailParam {
+
+    @ApiModelProperty(value = "orgId", required = true)
+    private String orgId;
+
+    @ApiModelProperty(value = "时间类型 0为月 1为年", required = true)
+    private Integer type;
+
+    @ApiModelProperty(value = "数据类型 0为饲料级VD3,",required = true)
+    private Integer dataType;
+}

+ 17 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionPageParam.java

@@ -0,0 +1,17 @@
+package vip.xiaonuo.production.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ProductionPageParam {
+
+    @ApiModelProperty(value = "组织id",position = 1)
+    private String orgId;
+
+    @ApiModelProperty(value = "当前页码",position = 2)
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "页码大小",position = 3)
+    private Integer pageSize;
+}

+ 2 - 2
huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionParam.java

@@ -33,10 +33,10 @@ public class ProductionParam {
     @ApiModelProperty(value = "时间", required = true)
     private String time;
 
-    @ApiModelProperty(value = "产品可先传测试", required = true)
+    @ApiModelProperty(value = "产品名称", required = true)
     private String produceName;
 
-    @ApiModelProperty(value = "车间可先传A车间", required = true)
+    @ApiModelProperty(value = "车间名称", required = true)
     private String locationName;
 
 }

+ 14 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionScreenParam.java

@@ -0,0 +1,14 @@
+package vip.xiaonuo.production.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class ProductionScreenParam {
+
+    @ApiModelProperty(value = "组织id",position = 1)
+    private String orgId;
+
+    @ApiModelProperty(value = "产品名称",position = 2)
+    private String produceName;
+}

+ 37 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionTargetParam.java

@@ -0,0 +1,37 @@
+/*
+ * Copyright [2022] [https://www.baiduc.com]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.baiduc.com
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.baiduc.com
+ */
+package vip.xiaonuo.production.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 人员明细Id参数
+ *
+ * @author 余
+ * @date  2024/11/14 15:02
+ **/
+@Getter
+@Setter
+public class ProductionTargetParam {
+
+
+    @ApiModelProperty(value = "orgId", required = true)
+    private String orgId;
+
+    @ApiModelProperty(value = "时间", required = true)
+    private String time;
+
+
+}

+ 34 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionVoParam.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.baiduc.com]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.baiduc.com
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.baiduc.com
+ */
+package vip.xiaonuo.production.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 人员明细Id参数
+ *
+ * @author 余
+ * @date  2024/11/14 15:02
+ **/
+@Getter
+@Setter
+public class ProductionVoParam {
+
+
+    @ApiModelProperty(value = "orgId", required = true)
+    private String orgId;
+
+
+}

+ 69 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionWritePlanAddParam.java

@@ -0,0 +1,69 @@
+package vip.xiaonuo.production.param;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 计划生产量填报
+ * </p>
+ *
+ * @author author
+ * @since 2025-02-25
+ */
+@Data
+public class ProductionWritePlanAddParam  {
+
+    /**
+     * 计划生产量
+     */
+    @ApiModelProperty(value = "计划生产量",position = 1)
+    private String productionPlan;
+
+    /**
+     * 产品名称
+     */
+    @ApiModelProperty(value = "产品名称",position = 2)
+    private String productionName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间",position = 3)
+    @JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 车间名称
+     */
+    @ApiModelProperty(value = "车间名称",position = 4)
+    private String locationName;
+
+    /**
+     * 车间id
+     */
+    @ApiModelProperty(value = "车间id",position = 5)
+    private String locationId;
+
+    /**
+     * 组织id
+     */
+    @ApiModelProperty(value = "组织id",position = 6)
+    private String orgId;
+
+    /**
+     * 组织id
+     */
+    @ApiModelProperty(value = "公司名称",position = 7)
+    private String orgName;
+
+}

+ 43 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/param/ProductionWritePlanParam.java

@@ -0,0 +1,43 @@
+/*
+ * Copyright [2022] [https://www.baiduc.com]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.baiduc.com
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.baiduc.com
+ */
+package vip.xiaonuo.production.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 人员明细Id参数
+ *
+ * @author 余
+ * @date  2024/11/14 15:02
+ **/
+@Getter
+@Setter
+public class ProductionWritePlanParam {
+
+
+    @ApiModelProperty(value = "orgId", required = true)
+    private String orgId;
+
+    @ApiModelProperty(value = "车间名称", required = true)
+    private String locationId;
+
+    @ApiModelProperty(value = "产品名称", required = true)
+    private String productionName;
+
+    @ApiModelProperty(value = "时间,所选的为月份2025-02", required = true)
+    private String time;
+
+
+}

+ 21 - 2
huimv-farm/src/main/java/vip/xiaonuo/production/service/IProductionWorkstopPlanService.java

@@ -1,9 +1,11 @@
 package vip.xiaonuo.production.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import vip.xiaonuo.production.entity.ProductionWorkstopPlan;
 import com.baomidou.mybatisplus.extension.service.IService;
-import vip.xiaonuo.production.entity.vo.ProductionPlanVo;
-import vip.xiaonuo.production.param.ProductionPlanParam;
+import vip.xiaonuo.production.entity.vo.*;
+import vip.xiaonuo.production.param.*;
 
 import java.util.List;
 
@@ -19,4 +21,21 @@ public interface IProductionWorkstopPlanService extends IService<ProductionWorks
 
     List<ProductionPlanVo> getList(ProductionPlanParam planParam);
 
+    //大屏生成与质量指标
+    ProductionWorkPlanTargetVo getTarget(ProductionTargetParam targetParam);
+
+    //大屏生成与质量指标详情
+    List<ProductionPlanDetailVo> getDetail(ProductionDetailParam detailParam);
+
+    //大屏主要产品计划与实际产量
+    List<ProductionVo> listScreen(ProductionScreenParam screenParam);
+
+    //大屏各车间产品完成率排名top10,包含全部
+    IPage<ProductionWorkstopPlan> getTop(ProductionPageParam pageParam);
+
+    //车间列表
+    List<ProductionLocationVo> listLocation(ProductionVoParam voParam);
+
+    //产品名称列表
+    List<ProductionNameVo> listProductionName(ProductionVoParam voParam);
 }

+ 31 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/service/IProductionWritePlanService.java

@@ -0,0 +1,31 @@
+package vip.xiaonuo.production.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.production.entity.ProductionWritePlan;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.production.param.*;
+
+import java.text.ParseException;
+import java.util.Map;
+
+/**
+ * <p>
+ * 计划生产量填报 服务类
+ * </p>
+ *
+ * @author author
+ * @since 2025-02-25
+ */
+public interface IProductionWritePlanService extends IService<ProductionWritePlan> {
+
+    CommonResult add(ProductionWritePlanAddParam param) throws ParseException;
+
+    CommonResult list(Map<String, String> paramsMap);
+
+    CommonResult edit(ProductionWritePlan writePlan);
+
+    CommonResult delete(Map<String, String> paramsMap);
+
+    Page<ProductionWritePlan> page(ProductionPageParam pageParam);
+}

+ 48 - 8
huimv-farm/src/main/java/vip/xiaonuo/production/service/impl/ProductionTargetServiceImpl.java

@@ -1,10 +1,17 @@
 package vip.xiaonuo.production.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import vip.xiaonuo.production.entity.ProductionEnergy;
 import vip.xiaonuo.production.entity.ProductionTarget;
+import vip.xiaonuo.production.entity.ProductionWorkstopPlan;
+import vip.xiaonuo.production.entity.ProductionWritePlan;
 import vip.xiaonuo.production.mapper.ProductionTargetMapper;
+import vip.xiaonuo.production.mapper.ProductionWorkstopPlanMapper;
+import vip.xiaonuo.production.mapper.ProductionWriteEnergyMapper;
+import vip.xiaonuo.production.mapper.ProductionWritePlanMapper;
 import vip.xiaonuo.production.param.ProductionParam;
 import vip.xiaonuo.production.service.IProductionTargetService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -12,6 +19,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.DecimalFormat;
 
 /**
  * <p>
@@ -26,23 +34,55 @@ public class ProductionTargetServiceImpl extends ServiceImpl<ProductionTargetMap
 
     @Autowired
     private ProductionTargetMapper targetMapper;
+    @Autowired
+    private ProductionWorkstopPlanMapper planMapper;
+    @Autowired
+    private ProductionWritePlanMapper writePlanMapper;
+
 
     @Override
     public ProductionTarget getTarget(ProductionParam productionParam) {
         String orgId = productionParam.getOrgId();
         String time = productionParam.getTime();
+        String produceName = productionParam.getProduceName();
         String locationName = productionParam.getLocationName();
-        QueryWrapper<ProductionTarget> queryWrapper = new QueryWrapper<>();
+        QueryWrapper<ProductionWorkstopPlan> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
         queryWrapper.between("create_time", time + "-01 00:00:00", time + "-31 23:59:59");
-        queryWrapper.select(" IFNULL(sum(plan_production),'0') planProduction," +
-                "convert(IFNULL(avg(plan_complete_rate),'0'),decimal(10,2)) planCompleteRate,IFNULL(sum(actual_production),'0') actualProduction," +
-                "convert(IFNULL(avg(receive_rate),'0'),decimal(10,2)) receiveRate,IFNULL(sum(production_energy),'0') productionEnergy");
+        queryWrapper.select("Convert(IFNULL(sum(actual_production),'0'),decimal(10,2)) actualProduction");
+        if (StringUtils.isNotBlank(produceName)) {
+            queryWrapper.like("produce_name", produceName);
+        }
         queryWrapper.eq(StringUtils.isNotBlank(locationName), "location_name", locationName);
-        ProductionTarget productionTarget = targetMapper.selectOne(queryWrapper);
-        BigDecimal math = new BigDecimal("10000");
-        BigDecimal bg = new BigDecimal(productionTarget.getActualProduction());
-        productionTarget.setActualProduction(bg.divide(math, 2, RoundingMode.HALF_UP).toString());
+        ProductionWorkstopPlan workstopPlan = planMapper.selectOne(queryWrapper);//实际产量
+
+        QueryWrapper<ProductionWritePlan> queryWrapper1 = new QueryWrapper<>();
+        queryWrapper1.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        queryWrapper1.eq(StringUtils.isNotBlank(locationName), "location_name", locationName);
+        queryWrapper1.eq(StringUtils.isNotBlank(produceName), "production_name", produceName);
+        queryWrapper1.between("create_time", time + "-01 00:00:00", time + "-31 23:59:59");
+        queryWrapper1.select(" Convert(IFNULL(sum(production_plan),'0'),decimal(10,2)) productionPlan");
+        ProductionWritePlan writePlan = writePlanMapper.selectOne(queryWrapper1);//计划生产量
+
+        ProductionTarget productionTarget = new ProductionTarget();
+        if (ObjectUtil.isEmpty(writePlan) || "0".equals(writePlan.getProductionPlan())) {
+            productionTarget.setPlanProduction("0");
+            productionTarget.setPlanCompleteRate("0");
+        } else {
+            productionTarget.setPlanProduction(writePlan.getProductionPlan());
+            double v = Double.valueOf(workstopPlan.getActualProduction()) / Double.valueOf(writePlan.getProductionPlan());
+            if (v > 1.0) {
+                productionTarget.setPlanCompleteRate("100");
+            } else {
+                DecimalFormat def = new DecimalFormat("0.00");
+                productionTarget.setPlanCompleteRate(def.format(v * 100));
+            }
+        }
+
+        productionTarget.setActualProduction(workstopPlan.getActualProduction());
+        productionTarget.setReceiveRate("0");
+        productionTarget.setProductionEnergy("0");
+
         return productionTarget;
     }
 

+ 293 - 6
huimv-farm/src/main/java/vip/xiaonuo/production/service/impl/ProductionWorkstopPlanServiceImpl.java

@@ -1,24 +1,29 @@
 package vip.xiaonuo.production.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONException;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.beans.factory.annotation.Autowired;
 import vip.xiaonuo.production.entity.ProduceLocation;
 import vip.xiaonuo.production.entity.ProductionWorkstopPlan;
-import vip.xiaonuo.production.entity.vo.ProductionPlanVo;
-import vip.xiaonuo.production.entity.vo.ProductionWorkPlanVo;
+import vip.xiaonuo.production.entity.vo.*;
 import vip.xiaonuo.production.mapper.ProduceLocationMapper;
 import vip.xiaonuo.production.mapper.ProductionUnitCostMapper;
 import vip.xiaonuo.production.mapper.ProductionWorkstopPlanMapper;
-import vip.xiaonuo.production.param.ProductionPlanParam;
+import vip.xiaonuo.production.param.*;
 import vip.xiaonuo.production.service.IProductionWorkstopPlanService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
+import vip.xiaonuo.purchase.param.GongYingShangParam;
+import vip.xiaonuo.sale.entity.SaleSalesman;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * <p>
@@ -91,4 +96,286 @@ public class ProductionWorkstopPlanServiceImpl extends ServiceImpl<ProductionWor
 
         return list;
     }
+
+    @Override
+    public ProductionWorkPlanTargetVo getTarget(ProductionTargetParam targetParam) {
+        String orgId = targetParam.getOrgId();
+        String time = targetParam.getTime();
+        String year = time.substring(0, 4);
+        String month = time.substring(5, 7);
+        int last = Integer.parseInt(year) - 1;
+        ProductionPlanVo2 vd = planMapper.getTarget(time + "-01 00:00:00", time + "-31 23:59:59",
+                last + "-" + month + "-01 00:00:00", last + "-" + month + "-31 23:59:59", orgId, "饲料级VD3");
+        ProductionPlanVo2 vd2 = planMapper.getTarget(time + "-01 00:00:00", time + "-31 23:59:59",
+                last + "-" + month + "-01 00:00:00", last + "-" + month + "-31 23:59:59", orgId, "VD3结晶");
+        ProductionPlanVo2 vd3 = planMapper.getTarget(time + "-01 00:00:00", time + "-31 23:59:59",
+                last + "-" + month + "-01 00:00:00", last + "-" + month + "-31 23:59:59", orgId, "胆固醇");
+        ProductionPlanVo2 vd4 = planMapper.getTarget(time + "-01 00:00:00", time + "-31 23:59:59",
+                last + "-" + month + "-01 00:00:00", last + "-" + month + "-31 23:59:59", orgId, "25-羟基VD3");
+        ProductionPlanVo2 vd5 = planMapper.getTarget(time + "-01 00:00:00", time + "-31 23:59:59",
+                last + "-" + month + "-01 00:00:00", last + "-" + month + "-31 23:59:59", orgId, "维生素A微粒");
+
+        ProductionWorkPlanTargetVo vo = new ProductionWorkPlanTargetVo();
+        //饲料级VD3
+        if (ObjectUtil.isNotEmpty(vd)) {
+            String monthValue = vd.getMonthValue();
+            String lastMonthValue = vd.getLastMonthValue();
+            vo.setComplete(monthValue);
+            if ("0".equals(lastMonthValue) || null == lastMonthValue) {
+                vo.setCompleteRate("0");
+            } else {
+                double v = (Double.valueOf(month) - Double.valueOf(lastMonthValue)) / Double.valueOf(lastMonthValue);
+                DecimalFormat def = new DecimalFormat("0.00");
+                if (v > 1.00) {
+                    vo.setCompleteRate("100");
+                } else {
+                    vo.setCompleteRate(def.format(v * 100));
+                }
+            }
+        }
+        //VD3结晶
+        if (ObjectUtil.isNotEmpty(vd2)) {
+            String monthValue = vd2.getMonthValue();
+            String lastMonthValue = vd2.getLastMonthValue();
+            vo.setVisitNum(monthValue);
+            if ("0".equals(lastMonthValue) || null == lastMonthValue) {
+                vo.setVisitNumRate("0");
+            } else {
+                double v = (Double.valueOf(month) - Double.valueOf(lastMonthValue)) / Double.valueOf(lastMonthValue);
+                DecimalFormat def = new DecimalFormat("0.00");
+                if (v > 1.00) {
+                    vo.setVisitNumRate("100");
+                } else {
+                    vo.setVisitNumRate(def.format(v * 100));
+                }
+            }
+        }
+        //胆固醇
+        if (ObjectUtil.isNotEmpty(vd3)) {
+            String monthValue = vd3.getMonthValue();
+            String lastMonthValue = vd3.getLastMonthValue();
+            vo.setSaleMoney(monthValue);
+            if ("0".equals(lastMonthValue) || null == lastMonthValue) {
+                vo.setSaleMoneyRate("0");
+            } else {
+                double v = (Double.valueOf(month) - Double.valueOf(lastMonthValue)) / Double.valueOf(lastMonthValue);
+                DecimalFormat def = new DecimalFormat("0.00");
+                if (v > 1.00) {
+                    vo.setSaleMoneyRate("100");
+                } else {
+                    vo.setSaleMoneyRate(def.format(v * 100));
+                }
+            }
+        }
+        //25-羟基VD3
+        if (ObjectUtil.isNotEmpty(vd4)) {
+            String monthValue = vd4.getMonthValue();
+            String lastMonthValue = vd4.getLastMonthValue();
+            vo.setSaleDeliverMoney(monthValue);
+            if ("0".equals(lastMonthValue) || null == lastMonthValue) {
+                vo.setSaleDeliverMoneyRate("0");
+            } else {
+                double v = (Double.valueOf(month) - Double.valueOf(lastMonthValue)) / Double.valueOf(lastMonthValue);
+                DecimalFormat def = new DecimalFormat("0.00");
+                if (v > 1.00) {
+                    vo.setSaleDeliverMoneyRate("100");
+                } else {
+                    vo.setSaleDeliverMoneyRate(def.format(v * 100));
+                }
+            }
+        }
+        //维生素A微粒
+        if (ObjectUtil.isNotEmpty(vd5)) {
+            String monthValue = vd5.getMonthValue();
+            String lastMonthValue = vd5.getLastMonthValue();
+            vo.setReceiveMoney(monthValue);
+            if ("0".equals(lastMonthValue) || null == lastMonthValue) {
+                vo.setReceiveMoneyRate("0");
+            } else {
+                double v = (Double.valueOf(month) - Double.valueOf(lastMonthValue)) / Double.valueOf(lastMonthValue);
+                DecimalFormat def = new DecimalFormat("0.00");
+                if (v > 1.00) {
+                    vo.setReceiveMoneyRate("100");
+                } else {
+                    vo.setReceiveMoneyRate(def.format(v * 100));
+                }
+            }
+        }
+        vo.setEnergyMoney("0");
+        vo.setEnergyMoneyRate("0");
+        return vo;
+    }
+
+    @Override
+    public List<ProductionPlanDetailVo> getDetail(ProductionDetailParam detailParam) {
+        String orgId = detailParam.getOrgId();
+        Integer type = detailParam.getType();
+        Integer dataType = detailParam.getDataType();
+        List<ProductionPlanDetailVo> list = new ArrayList<>();
+        QueryWrapper<ProductionWorkstopPlan> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        queryWrapper.select(" convert(IFNULL(sum(actual_production),'0'),decimal(10,2)) actualProduction,create_time createTime");
+        switch (dataType) {
+            case 0:
+                queryWrapper.like("produce_name", "饲料级VD3");
+                break;
+            case 1:
+                queryWrapper.like("produce_name", "VD3结晶");
+                break;
+            case 2:
+                queryWrapper.like("produce_name", "胆固醇");
+                break;
+        }
+
+        if (0 == type) {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+            queryWrapper.groupBy("DATE_FORMAT(create_time,'%y-%m')");
+            List<ProductionWorkstopPlan> plans = planMapper.selectList(queryWrapper);
+            for (ProductionWorkstopPlan plan : plans) {
+                ProductionPlanDetailVo vo = new ProductionPlanDetailVo();
+                vo.setValues(plan.getActualProduction());
+                vo.setCreateTime(sdf.format(plan.getCreateTime()));
+                list.add(vo);
+            }
+        } else {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+            queryWrapper.groupBy("DATE_FORMAT(create_time,'%y')");
+            List<ProductionWorkstopPlan> plans = planMapper.selectList(queryWrapper);
+            for (ProductionWorkstopPlan plan : plans) {
+                ProductionPlanDetailVo vo = new ProductionPlanDetailVo();
+                vo.setValues(plan.getActualProduction());
+                vo.setCreateTime(sdf.format(plan.getCreateTime()));
+                list.add(vo);
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public List<ProductionVo> listScreen(ProductionScreenParam screenParam) {
+        String orgId = screenParam.getOrgId();
+        String produceName = screenParam.getProduceName();
+        QueryWrapper<ProductionWorkstopPlan> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        if (StringUtils.isNotBlank(produceName)) {
+            queryWrapper.like("produce_name", produceName);
+        }
+        queryWrapper.select(" convert(IFNULL(sum(actual_production),'0'),decimal(10,2)) actualProduction," +
+                "convert(IFNULL(sum(plan_production),'0'),decimal(10,2)) planProduction,create_time createTime");
+        queryWrapper.groupBy("DATE_FORMAT(create_time,'%y-%m')");
+        List<ProductionWorkstopPlan> plans = planMapper.selectList(queryWrapper);
+        List<ProductionVo> list = new ArrayList<>();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        if (plans.size() != 0) {
+            for (ProductionWorkstopPlan plan : plans) {
+                ProductionVo vo = new ProductionVo();
+                vo.setActualProduction(plan.getActualProduction());
+                vo.setPlanProduction(plan.getPlanProduction());
+                vo.setCreateTime(sdf.format(plan.getCreateTime()));
+                list.add(vo);
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public IPage<ProductionWorkstopPlan> getTop(ProductionPageParam pageParam) {
+        String orgId = pageParam.getOrgId();
+        Integer pageNum = pageParam.getPageNum();
+        Integer pageSize = pageParam.getPageSize();
+        Page<ProductionWorkstopPlan> page = new Page<>(pageNum, pageSize);
+        QueryWrapper<ProductionWorkstopPlan> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId).groupBy("location_name");
+        IPage<ProductionWorkstopPlan> planMapperTop = planMapper.getTop(queryWrapper, page);
+        List<ProductionWorkstopPlan> records = planMapperTop.getRecords();
+        List<ProductionWorkstopPlan> plans = jsonArraySort(records, true);
+        for (int i = 0; i < pageSize; i++) {
+            ProductionWorkstopPlan workstopPlan = plans.get(i);
+            workstopPlan.setId((pageNum-1) *pageSize + i+ 1 );
+        }
+        planMapperTop.setRecords(plans);
+        return planMapperTop;
+    }
+
+    @Override
+    public List<ProductionLocationVo> listLocation(ProductionVoParam voParam) {
+        String orgId = voParam.getOrgId();
+        QueryWrapper<ProductionWorkstopPlan> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId).groupBy("location_name");
+        List<ProductionWorkstopPlan> workstopPlans = planMapper.selectList(queryWrapper);
+        List<ProductionLocationVo> list = new ArrayList<>();
+        for (ProductionWorkstopPlan workstopPlan : workstopPlans) {
+            ProductionLocationVo vo = new ProductionLocationVo();
+            vo.setLocationId(workstopPlan.getLocationId());
+            vo.setLocationName(workstopPlan.getLocationName());
+            vo.setOrgId(workstopPlan.getOrgId());
+            list.add(vo);
+        }
+        return list;
+    }
+
+    @Override
+    public List<ProductionNameVo> listProductionName(ProductionVoParam voParam) {
+        List<ProductionNameVo> list = new ArrayList<>();
+        ProductionNameVo vo = new ProductionNameVo();
+        vo.setProduceName("饲料级VD3");
+        list.add(vo);
+        ProductionNameVo vo2 = new ProductionNameVo();
+        vo2.setProduceName("VD3结晶");
+        list.add(vo2);
+        ProductionNameVo vo3 = new ProductionNameVo();
+        vo3.setProduceName("胆固醇");
+        list.add(vo3);
+        ProductionNameVo vo4 = new ProductionNameVo();
+        vo4.setProduceName("25-羟基D3");
+        list.add(vo4);
+        ProductionNameVo vo5 = new ProductionNameVo();
+        vo5.setProduceName("维生素A微粒");
+        list.add(vo5);
+        return list;
+    }
+
+    /*数组排序*/
+    public static List<ProductionWorkstopPlan> jsonArraySort(List<ProductionWorkstopPlan> jsonArr, boolean is_desc) {
+        //存放排序结果json数组
+        List<ProductionWorkstopPlan> salesmanList = new ArrayList<>();
+        //用于排序的list
+        List<ProductionWorkstopPlan> list = new ArrayList<>();
+        //将参数json数组每一项取出,放入list
+
+        for (int i = 0; i <jsonArr.size() ; i++) {
+            list.add(jsonArr.get(i));
+        }
+
+        //快速排序,重写compare方法,完成按指定字段比较,完成排序
+        Collections.sort(list, new Comparator<ProductionWorkstopPlan>() {
+            @Override
+            public int compare(ProductionWorkstopPlan o1, ProductionWorkstopPlan o2) {
+                //如果用String接会导致一位数和两位数混合比对的时候不能准确比出来,要用int类型接
+                //String valA = new String();
+                //String valB = new String();
+                Float valA = 0.00f;
+                Float valB = 0.00f;
+                try {
+                    valA = Float.parseFloat(o1.getActualProduction());
+                    valB = Float.parseFloat(o2.getActualProduction());
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                }
+                //是升序还是降序
+                if (is_desc) {
+                    return -valA.compareTo(valB);
+                } else {
+                    return -valB.compareTo(valA);
+                }
+
+            }
+        });
+        //将排序后结果放入结果jsonArray
+        for (int i = 0; i < jsonArr.size(); i++) {
+            salesmanList.add(list.get(i));
+        }
+
+        return salesmanList;
+    }
 }

+ 80 - 0
huimv-farm/src/main/java/vip/xiaonuo/production/service/impl/ProductionWritePlanServiceImpl.java

@@ -0,0 +1,80 @@
+package vip.xiaonuo.production.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.production.entity.ProductionWritePlan;
+import vip.xiaonuo.production.mapper.ProductionWritePlanMapper;
+import vip.xiaonuo.production.param.ProductionPageParam;
+import vip.xiaonuo.production.param.ProductionWritePlanAddParam;
+import vip.xiaonuo.production.service.IProductionWritePlanService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.sys.modular.org.entity.SysOrg;
+import vip.xiaonuo.sys.modular.org.mapper.SysOrgMapper;
+
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * <p>
+ * 计划生产量填报 服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2025-02-25
+ */
+@Service
+public class ProductionWritePlanServiceImpl extends ServiceImpl<ProductionWritePlanMapper, ProductionWritePlan> implements IProductionWritePlanService {
+
+    @Autowired
+    private ProductionWritePlanMapper planMapper;
+    @Autowired
+    private SysOrgMapper orgMapper;
+
+    @Override
+    public CommonResult add(ProductionWritePlanAddParam writePlan) throws ParseException {
+        String orgId = writePlan.getOrgId();
+        SysOrg org = orgMapper.selectOne(new QueryWrapper<SysOrg>().eq("id", orgId));
+        ProductionWritePlan plan = new ProductionWritePlan();
+        BeanUtil.copyProperties(writePlan, plan);
+        plan.setOrgName(org.getName());
+        planMapper.insert(plan);
+        return CommonResult.ok();
+    }
+
+    @Override
+    public CommonResult list(Map<String, String> paramsMap) {
+        return null;
+    }
+
+    @Override
+    public CommonResult edit(ProductionWritePlan writePlan) {
+        planMapper.updateById(writePlan);
+        return CommonResult.ok();
+    }
+
+    @Override
+    public CommonResult delete(Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        planMapper.deleteById(id);
+        return CommonResult.ok();
+    }
+
+    @Override
+    public Page<ProductionWritePlan> page(ProductionPageParam pageParam) {
+        Integer pageSize = pageParam.getPageSize();
+        Integer pageNum = pageParam.getPageNum();
+        String orgId = pageParam.getOrgId();
+        QueryWrapper<ProductionWritePlan> queryWrapper = new QueryWrapper();
+        Page<ProductionWritePlan> page = new Page<>(pageNum, pageSize);
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId);
+        return planMapper.selectPage(page, queryWrapper);
+    }
+}

+ 8 - 6
huimv-farm/src/main/java/vip/xiaonuo/production/service/impl/ProductionYieldServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import vip.xiaonuo.production.entity.ProductionYield;
+import vip.xiaonuo.production.mapper.ProductionWritePlanMapper;
 import vip.xiaonuo.production.mapper.ProductionYieldMapper;
 import vip.xiaonuo.production.param.ProductionYieldParam;
 import vip.xiaonuo.production.service.IProductionYieldService;
@@ -29,6 +30,8 @@ public class ProductionYieldServiceImpl extends ServiceImpl<ProductionYieldMappe
 
     @Autowired
     private ProductionYieldMapper yieldMapper;
+    @Autowired
+    private ProductionWritePlanMapper writePlanMapper;
 
     @Override
     public List<ProductionYield> getList(ProductionYieldParam yieldParam) {
@@ -37,15 +40,14 @@ public class ProductionYieldServiceImpl extends ServiceImpl<ProductionYieldMappe
         String locationName = yieldParam.getLocationName();
         String produceName = yieldParam.getProduceName();
         QueryWrapper<ProductionYield> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId)
-                .eq(StringUtils.isNotBlank(produceName),"produce_name",produceName)
-                .eq(StringUtils.isNotBlank(locationName),"location_name",locationName);
-        queryWrapper.select(" IFNULL(sum(plan_production),'0') planProduction,IFNULL(sum(actual_production),'0') actualProduction," +
-                "convert(IFNULL(avg(complete_rate),'0'),decimal(10,2)) completeRate,create_time createTime");
+        queryWrapper.eq(StringUtils.isNotBlank(orgId), "org_id", orgId).eq(StringUtils.isNotBlank(locationName),"location_name",locationName);
+        if (StringUtils.isNotBlank(locationName)) {
+            queryWrapper.like(StringUtils.isNotBlank(produceName), "produce_name", produceName);
+        }
+        queryWrapper.select(" convert(IFNULL(sum(actual_production),'0'),decimal(10,2)) actualProduction,create_time createTime");
         if (0 == timeType) {
             queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y')");
         } else {
-            queryWrapper.ge("create_time", DateUtil.beginOfYear(new Date()));
             queryWrapper.groupBy("DATE_FORMAT(create_time,'%Y-%m')");
         }
         queryWrapper.orderByAsc("create_time");

+ 4 - 4
huimv-farm/src/main/java/vip/xiaonuo/sale/service/impl/SaleTargetServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springframework.beans.factory.annotation.Autowired;
+import vip.xiaonuo.production.entity.ProductionWorkstopPlan;
 import vip.xiaonuo.sale.entity.*;
 import vip.xiaonuo.sale.entity.vo.SaleTargetDetailVo;
 import vip.xiaonuo.sale.entity.vo.SaleTargetVo;
@@ -372,10 +373,9 @@ public class SaleTargetServiceImpl extends ServiceImpl<SaleTargetMapper, SaleTar
         queryWrapper.groupBy("customer_name");
         Page<SaleTarget> targets = targetMapper.selectPage(page, queryWrapper);
         List<SaleTarget> records = targets.getRecords();
-        if (records.size() != 0) {
-            for (int i = 0; i < records.size(); i++) {
-                records.get(i).setId(i + 1);
-            }
+        for (int i = 0; i < pageSize; i++) {
+            SaleTarget workstopPlan = records.get(i);
+            workstopPlan.setId((pageNum-1) *pageSize + i+ 1 );
         }
         return targets;
     }

+ 31 - 0
huimv-farm/src/main/resources/mapper/ProductionWorkstopPlanMapper.xml

@@ -2,4 +2,35 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="vip.xiaonuo.production.mapper.ProductionWorkstopPlanMapper">
 
+    <select id="getTarget" resultType="vip.xiaonuo.production.entity.vo.ProductionPlanVo2">
+
+        SELECT
+        COALESCE(curr.produceName, prev.produceName) AS produceName,
+        IFNULL(curr.actualProduction,'0') AS monthValue,
+        IFNULL(prev.actualProduction,'0') AS lastMonthValue
+        FROM
+        (SELECT produce_name produceName, IFNULL(sum(actual_production),'0') actualProduction
+        FROM production_workstop_plan
+        WHERE create_time between #{start} AND #{end}
+        <if test="orgId!=null and orgId!=''">
+            and  org_id = #{orgId}
+        </if>
+        AND produce_name LIKE '%${name}%') AS curr
+        LEFT JOIN
+        (SELECT produce_name produceName, IFNULL(sum(actual_production),'0') actualProduction
+        FROM production_workstop_plan
+        WHERE create_time between #{lastStart} AND #{lastEnd}
+        <if test="orgId!=null and orgId!=''">
+            and org_id = #{orgId}
+        </if>
+        AND produce_name LIKE '%${name}%') AS prev
+        ON curr.produceName = prev.produceName;
+
+    </select>
+
+    <select id="getTop" resultType="vip.xiaonuo.production.entity.ProductionWorkstopPlan">
+        SELECT @rownum := @rownum + 1 AS id,convert(IFNULL(sum(actual_production),'0'),decimal(10,2)) actualProduction,location_name locationName
+         FROM production_workstop_plan, (SELECT @rownum := 0) r
+         ${ew.customSqlSegment}
+    </select>
 </mapper>

+ 5 - 0
huimv-farm/src/main/resources/mapper/ProductionWritePlanMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="vip.xiaonuo.production.mapper.ProductionWritePlanMapper">
+
+</mapper>