瀏覽代碼

添加了报价单的数据

wxf 2 年之前
父節點
當前提交
f23c5afaba

+ 40 - 0
hx-item/src/main/java/com/fjhx/item/controller/product/ProductInfoController.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.item.entity.product.dto.ProductInfoDto;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
+import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.entity.product.vo.ProductInfoVo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.ruoyi.common.core.domain.BaseSelectDto;
@@ -12,6 +13,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+import java.util.Map;
+
 
 /**
  * <p>
@@ -107,4 +111,40 @@ public class ProductInfoController {
     }
 
 
+    /**
+     * 产品统计(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @PostMapping("/productStatistics")
+    public Map<String, Object> productStatistics(@RequestBody ProductInfoDto productInfoDto) {
+        return productInfoService.productStatistics(productInfoDto);
+    }
+
+    /**
+     * 产品分布(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @PostMapping("/productDistribution")
+    public List<ProductInfo> productDistribution(@RequestBody ProductInfoDto productInfoDto) {
+       return productInfoService.productDistribution(productInfoDto);
+    }
+
+    /**
+     * 产品类型排行(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @PostMapping("/productTypeRanking")
+    public Page<ProductInfoVo> productTypeRanking(@RequestBody ProductInfoSelectDto productInfoDto) {
+        return productInfoService.productTypeRanking(productInfoDto);
+    }
+
+    /**
+     * 产品排行(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @PostMapping("/productRanking")
+    public Page<ProductInfoVo> productRanking(@RequestBody ProductInfoSelectDto productInfoDto) {
+        return productInfoService.productRanking(productInfoDto);
+    }
+
 }

+ 33 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductInfoDto.java

@@ -24,4 +24,37 @@ public class ProductInfoDto extends ProductInfo {
      */
     private Long deptId;
 
+    /**
+     * 开始时间
+     */
+    private  String beginTime;
+
+    /**
+     * 结束时间
+     */
+    private  String endTime;
+
+    /**
+     * 数量
+     */
+    private  Integer count;
+
+    /**
+     * 国家表ID
+     */
+    private Long countryId;
+
+    /**
+     * 排序(10 销售量排序  20 销售额排序  30 采购量排序  40 采购额排序  50 生产总量排序)
+     */
+    private  Integer sort;
+
+    /**
+     * 10 正序  20 倒序
+     */
+    private  Integer orderBy;
+
+
+
+
 }

+ 27 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductInfoSelectDto.java

@@ -39,4 +39,31 @@ public class ProductInfoSelectDto extends BaseSelectDto {
      */
     private Integer combination;
 
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+
+    /**
+     * 数量
+     */
+    private  Integer count;
+
+    /**
+     * 国家表ID
+     */
+    private Long countryId;
+
+    /**
+     * 排序(10 销售量排序  20 销售额排序  30 采购量排序  40 采购额排序  50 生产总量排序)
+     */
+    private  Integer sort;
+
+    /**
+     * 10 正序  20 倒序
+     */
+    private  Integer orderBy;
+
+
 }

+ 4 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductInfo.java

@@ -1,5 +1,6 @@
 package com.fjhx.item.entity.product.po;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.core.domain.BasePo;
 import lombok.Getter;
@@ -74,4 +75,7 @@ public class ProductInfo extends BasePo {
     /**产品spuid*/
     private Long productSpuId;
 
+    @TableField(exist = false)
+    private Integer count;
+
 }

+ 21 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/vo/ProductInfoVo.java

@@ -4,6 +4,7 @@ import com.fjhx.item.entity.product.po.ProductInfo;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -25,4 +26,24 @@ public class ProductInfoVo extends ProductInfo {
      */
     private Integer lifeCycle;
 
+    /**
+     *销售额
+     */
+    private BigDecimal contractAmount;
+
+    /**
+     * 销售量
+     */
+    private BigDecimal contractQuantity;
+
+    /**
+     * 采购额
+     */
+    private BigDecimal purchaseAmount;
+
+    /**
+     * 采购量
+     */
+    private BigDecimal purchaseQuantity;
+
 }

+ 12 - 0
hx-item/src/main/java/com/fjhx/item/mapper/product/ProductInfoMapper.java

@@ -1,5 +1,6 @@
 package com.fjhx.item.mapper.product;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.item.entity.product.po.ProductInfo;
@@ -39,4 +40,15 @@ public interface ProductInfoMapper extends BaseMapper<ProductInfo> {
      */
     List<ProductInfoVo> getListByProductType(@Param("productType") Integer productType);
 
+    /**
+     * 产品类型排行(数据看板-产品分析页面)
+     * @param query
+     */
+    Page<ProductInfoVo>  productTypeRanking(@Param("page") Page<Object> page,@Param("ew") QueryWrapper<Object> query);
+
+    /**
+     * 产品排行(数据看板-产品分析页面)
+     * @param query
+     */
+    Page<ProductInfoVo> productRanking(@Param("page") Page<Object> page,@Param("ew") QueryWrapper<Object> query);
 }

+ 25 - 0
hx-item/src/main/java/com/fjhx/item/service/product/ProductInfoService.java

@@ -9,6 +9,7 @@ import com.ruoyi.common.core.service.BaseService;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -85,4 +86,28 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
      * 产品部门移交 维多利亚
      */
     void transfer(ProductInfoDto productInfoDto);
+
+    /**
+     * 产品统计(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    Map<String,Object> productStatistics(ProductInfoDto productInfoDto);
+
+    /**
+     * 产品分布(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    List<ProductInfo> productDistribution(ProductInfoDto productInfoDto);
+
+    /**
+     * 产品类型排行(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    Page<ProductInfoVo> productTypeRanking(ProductInfoSelectDto productInfoDto);
+
+    /**
+     * 产品排行(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    Page<ProductInfoVo> productRanking(ProductInfoSelectDto productInfoDto);
 }

+ 158 - 0
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -6,6 +6,9 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.constant.SourceConstant;
@@ -19,9 +22,14 @@ import com.fjhx.item.mapper.product.ProductInfoMapper;
 import com.fjhx.item.service.product.ProductClassifyService;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.item.util.CodeEnum;
+import com.fjhx.tenant.entity.dict.dto.DictTenantDataSelectDto;
+import com.fjhx.tenant.entity.dict.vo.DictTenantDataVo;
+import com.fjhx.tenant.service.dict.DictTenantDataService;
+import com.obs.services.internal.ServiceException;
 import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
 import com.ruoyi.system.service.ISysDeptService;
@@ -30,6 +38,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -53,6 +62,9 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     @Autowired
     private ISysDeptService sysDeptService;
 
+    @Autowired
+    private DictTenantDataService dictTenantDataService;
+
     @Override
     public Page<ProductInfoVo> getPage(ProductInfoSelectDto dto) {
         IWrapper<ProductInfo> wrapper = getWrapper();
@@ -241,4 +253,150 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         updateById(productInfo);
     }
 
+    /**
+     * 产品统计(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @Override
+    public Map<String, Object> productStatistics(ProductInfoDto productInfoDto) {
+        if (ObjectUtil.isEmpty(productInfoDto) && ObjectUtil.isEmpty(productInfoDto.getBeginTime())
+                && StringUtils.isNotEmpty(productInfoDto.getEndTime())){
+            throw  new ServiceException("参数缺失:开始时间,结束时间不能为null");
+        }
+        //存放产品统计数据
+        Map map  =new HashMap();
+
+        //存放产品类型数据
+        List<Map<String,Object>> typeList = new ArrayList<>();
+
+
+        QueryWrapper<ProductInfo> query = Wrappers.<ProductInfo>query();
+        query.select("count(*) count,ifNull(type,999) type");
+        query.groupBy("type");
+        //查询每个类型的总计
+        List<ProductInfo> productInfos = baseMapper.selectList(query);
+        Map<String, List<ProductInfo>>  productInfoTotalMap= productInfos.stream().collect(Collectors.groupingBy(ProductInfo::getType));
+
+        query.ge("DATE_FORMAT(create_time,'%Y-%m-%d')",productInfoDto.getBeginTime());
+        query.le("DATE_FORMAT(create_time,'%Y-%m-%d')",productInfoDto.getEndTime());
+        //查询每个类型的新增数量
+        List<ProductInfo> productInfoList = baseMapper.selectList(query);
+        Map<String, List<ProductInfo>> productInfoTypeMap = productInfoList.stream().collect(Collectors.groupingBy(ProductInfo::getType));
+        //计算新增总计
+        Integer newTotal = productInfoList.stream().map(ProductInfo::getCount).reduce(Integer::sum).orElse(0);
+        //总计
+        Integer total = productInfos.stream().map(ProductInfo::getCount).reduce(Integer::sum).orElse(0);
+
+        map.put("newTotal",newTotal);
+        map.put("total",total);
+
+        //获取产品类型的字典数据
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        List<DictTenantDataVo> dictTenantDataVoList = getDict("product_type");
+        DynamicDataSourceContextHolder.poll();
+
+        if (ObjectUtil.isEmpty(dictTenantDataVoList)){
+            return map;
+        }
+
+        for (DictTenantDataVo dictTenantDataVo : dictTenantDataVoList) {
+            //存放每个类型的新增与总计
+            Map<String,Object> map1 = new HashMap<>();
+            //设置初使值
+            map1.put("type",dictTenantDataVo.getDictKey());
+            map1.put("typeNewTotal",0);
+            map1.put("typeTotal",0);
+
+            //赋值新增的款数
+            List<ProductInfo> productInfoNewList = productInfoTypeMap.get(dictTenantDataVo.getDictKey());
+            if (ObjectUtil.isNotEmpty(productInfoNewList)) {
+                map1.put("typeNewTotal",productInfoNewList.get(0).getCount());
+            }
+
+            //赋值类型总计
+            List<ProductInfo> productInfoTotalList = productInfoTotalMap.get(dictTenantDataVo.getDictKey());
+            if (ObjectUtil.isNotEmpty(productInfoTotalList)){
+                map1.put("typeTotal",productInfoTotalList.get(0).getCount());
+            }
+            typeList.add(map1);
+        }
+        map.put("typeList",typeList);
+
+        return map;
+    }
+
+    /**
+     * 产品分布(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @Override
+    public List<ProductInfo> productDistribution(ProductInfoDto productInfoDto) {
+        if (ObjectUtil.isEmpty(productInfoDto) && ObjectUtil.isEmpty(productInfoDto.getBeginTime())
+                && StringUtils.isNotEmpty(productInfoDto.getEndTime())){
+            throw  new ServiceException("参数缺失:开始时间,结束时间不能为null");
+        }
+        QueryWrapper<ProductInfo> query = Wrappers.<ProductInfo>query();
+        query.select("count(*) count,type");
+        query.groupBy("type");
+        //查询每个类型的总计
+        List<ProductInfo> productInfos = baseMapper.selectList(query);
+        return productInfos;
+    }
+
+    /**
+     * 产品类型排行(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @Override
+    public Page<ProductInfoVo> productTypeRanking(ProductInfoSelectDto productInfoDto) {
+        QueryWrapper<Object> query = Wrappers.query();
+        query.ge("DATE_FORMAT(pc.create_time,'%Y-%m-%d')",productInfoDto.getBeginTime());
+        query.le("DATE_FORMAT(pc.create_time,'%Y-%m-%d')",productInfoDto.getEndTime());
+        query.eq(ObjectUtil.isNotEmpty(productInfoDto.getCountryId()),"bc.buy_country_id",productInfoDto.getCountryId());
+        sort(query,productInfoDto);
+        query.groupBy("pi.type");
+        Page<ProductInfoVo> productInfoVos = baseMapper.productTypeRanking(productInfoDto.getPage(),query);
+        return productInfoVos;
+    }
+
+    /**
+     * 产品排行(数据看板-产品分析页面)
+     * @param productInfoDto
+     */
+    @Override
+    public Page<ProductInfoVo> productRanking(ProductInfoSelectDto productInfoDto) {
+        QueryWrapper<Object> query = Wrappers.query();
+        query.ge("DATE_FORMAT(pc.create_time,'%Y-%m-%d')",productInfoDto.getBeginTime());
+        query.le("DATE_FORMAT(pc.create_time,'%Y-%m-%d')",productInfoDto.getEndTime());
+        query.eq(ObjectUtil.isNotEmpty(productInfoDto.getCountryId()),"bc.buy_country_id",productInfoDto.getCountryId());
+        sort(query,productInfoDto);
+        query.groupBy("pi.name");
+        Page<ProductInfoVo> productInfoVos = baseMapper.productRanking(productInfoDto.getPage(),query);
+        return productInfoVos;
+    }
+
+
+    //根据字典编码获取字典的数据
+    private List<DictTenantDataVo> getDict(String code){
+        DictTenantDataSelectDto dto = new DictTenantDataSelectDto();
+        dto.setDictCode(code);
+        List<DictTenantDataVo> dictTenantDataServiceList = dictTenantDataService.getList(dto);
+        return dictTenantDataServiceList;
+    }
+
+    //排序(添加排序条件)
+    private void sort( QueryWrapper<Object> query,ProductInfoSelectDto productInfoDto){
+        if (productInfoDto.getOrderBy() ==10){//正序
+            query.orderByAsc(productInfoDto.getSort() ==10,"contractQuantity");
+            query.orderByAsc(productInfoDto.getSort() ==20,"contractAmount");
+            query.orderByAsc(productInfoDto.getSort() ==30,"purchaseQuantity");
+            query.orderByAsc(productInfoDto.getSort() ==40,"purchaseAmount");
+        }else if (productInfoDto.getOrderBy() == 20){//倒序
+            query.orderByDesc(productInfoDto.getSort() ==10,"contractQuantity");
+            query.orderByDesc(productInfoDto.getSort() ==20,"contractAmount");
+            query.orderByDesc(productInfoDto.getSort() ==30,"purchaseQuantity");
+            query.orderByDesc(productInfoDto.getSort() ==40,"purchaseAmount");
+        }
+    }
+
 }

+ 28 - 0
hx-item/src/main/resources/mapper/product/ProductInfoMapper.xml

@@ -54,4 +54,32 @@
             </if>
         </where>
     </select>
+    <select id="productTypeRanking" resultType="com.fjhx.item.entity.product.vo.ProductInfoVo">
+        SELECT
+            pi.type type,
+            ifnull(SUM(pc.amount),0) contractAmount,
+            ifnull(SUM(pc.quantity),0) contractQuantity,
+            ifnull(sum(pd.amount),0) purchaseAmount,
+            IFNULL(SUM(pd.count),0) purchaseQuantity
+        FROM
+            product_info pi
+                LEFT JOIN bytesailing_sale.contract_product pc ON pi.id = pc.product_id
+                left join bytesailing_sale.contract bc on pc.contract_id = bc.id
+                left join bytesailing_purchase.purchase_detail pd on pi.id = pd.bussiness_id
+            ${ew.customSqlSegment}
+    </select>
+    <select id="productRanking" resultType="com.fjhx.item.entity.product.vo.ProductInfoVo">
+        SELECT
+            pi.name name,
+            ifnull(SUM(pc.amount),0) contractAmount,
+            ifnull(SUM(pc.quantity),0) contractQuantity,
+            ifnull(sum(pd.amount),0) purchaseAmount,
+            IFNULL(SUM(pd.count),0) purchaseQuantity
+        FROM
+            product_info pi
+                LEFT JOIN bytesailing_sale.contract_product pc ON pi.id = pc.product_id
+                left join bytesailing_sale.contract bc on pc.contract_id = bc.id
+                left join bytesailing_purchase.purchase_detail pd on pi.id = pd.bussiness_id
+            ${ew.customSqlSegment}
+    </select>
 </mapper>

+ 88 - 0
hx-purchase/src/main/java/com/fjhx/purchase/flow/PurchaseFlow.java

@@ -0,0 +1,88 @@
+package com.fjhx.purchase.flow;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.flow.core.FlowDelegate;
+import com.fjhx.purchase.entity.purchase.enums.PurchaseDetailStatusEnum;
+import com.fjhx.purchase.entity.purchase.enums.PurchaseStatusEnum;
+import com.fjhx.purchase.entity.purchase.po.Purchase;
+import com.fjhx.purchase.entity.purchase.po.PurchaseDetail;
+import com.fjhx.purchase.service.purchase.PurchaseDetailService;
+import com.fjhx.purchase.service.purchase.PurchaseService;
+import com.fjhx.purchase.util.code.CodeEnum;
+import com.obs.services.internal.ServiceException;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 采购流程
+ * @Author:caozj
+ * @DATE:2023/4/3 17:38
+ */
+@DS(SourceConstant.PURCHASE)
+@Component
+public class PurchaseFlow extends FlowDelegate {
+
+    @Override
+    public String getFlowKey() {
+        return "purchase_flow";
+    }
+
+
+    /**
+     * 发起流程
+     * @param flowId 流程ID
+     * @param submitData 申购数据
+     * @return
+     */
+    @Override
+    public Long start(Long flowId, JSONObject submitData) {
+        PurchaseService purchaseService = SpringUtil.getBean(PurchaseService.class);
+        PurchaseDetailService purchaseDetailService = SpringUtil.getBean(PurchaseDetailService.class);
+        Purchase purchase = submitData.toJavaObject(Purchase.class);
+        purchase.setCode(CodeEnum.PURCHASE.getCode());
+        purchase.setPurchaseStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey());
+        purchaseService.save(purchase);
+        List<PurchaseDetail> purchaseDetailList = purchase.getPurchaseDetailList();
+        if(CollectionUtils.isNotEmpty(purchaseDetailList)){
+            for(PurchaseDetail s : purchaseDetailList){
+                s.setPurchaseId(purchase.getId());
+            }
+            purchaseDetailService.saveBatch(purchaseDetailList);
+        }
+        return purchase.getId();
+    }
+
+    /**
+     * 结束流程
+     * @param flowId 流程ID
+     * @param businessId 业务ID
+     * @param submitData 数据
+     */
+    @Override
+    public void end(Long flowId, Long businessId, JSONObject submitData) {
+        PurchaseService purchaseService = SpringUtil.getBean(PurchaseService.class);
+        PurchaseDetailService purchaseDetailService = SpringUtil.getBean(PurchaseDetailService.class);
+        //通过业务ID查询申购数据
+        Purchase purchase = purchaseService.getById(businessId);
+        if(ObjectUtils.isEmpty(purchase)){
+            throw new ServiceException("采购单不存在");
+        }
+        //修改采购状态为审批通过
+        purchase.setPurchaseStatus(PurchaseStatusEnum.PASS.getKey());
+        purchase.setApprovedDate(new Date());
+        purchaseService.updateById(purchase);
+        //修改采购明细为待采购
+        PurchaseDetail detail = new PurchaseDetail();
+        detail.setStatus(PurchaseDetailStatusEnum.PASS.getKey());
+        purchaseDetailService.update(detail,Wrappers.<PurchaseDetail>query()
+                .lambda().eq(PurchaseDetail::getPurchaseId,purchase.getId()));
+    }
+}