feat(wms): 新增合同挂接钢卷统计功能
- 在IWmsCoilContractRelService接口中添加queryContractCoilStatistics方法 - 在WmsCoilContractRelController控制器中添加统计查询和导出接口 - 在WmsCoilContractRelMapper中添加selectContractCoilStatistics查询方法 - 实现合同挂接钢卷统计的SQL查询逻辑,支持多条件筛选 - 创建ContractCoilStatisticsBo查询对象和ContractCoilStatisticsVo视图对象 - 开发前端统计页面,包含搜索筛选、统计卡片、图表展示和数据表格 - 集成ECharts实现合同状态分布饼图和销售员挂接钢卷柱状图 - 实现统计数据的Excel导出功能 - 添加响应式设计适配移动端显示
This commit is contained in:
@@ -18,7 +18,9 @@ import com.klp.common.core.validate.EditGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.domain.vo.WmsCoilContractRelVo;
|
||||
import com.klp.domain.vo.ContractCoilStatisticsVo;
|
||||
import com.klp.domain.bo.WmsCoilContractRelBo;
|
||||
import com.klp.domain.bo.ContractCoilStatisticsBo;
|
||||
import com.klp.service.IWmsCoilContractRelService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
|
||||
@@ -97,6 +99,25 @@ public class WmsCoilContractRelController extends BaseController {
|
||||
return R.ok(updated);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询合同挂接情况统计
|
||||
*/
|
||||
@GetMapping("/statistics")
|
||||
public R<List<ContractCoilStatisticsVo>> statistics(ContractCoilStatisticsBo bo) {
|
||||
List<ContractCoilStatisticsVo> list = iWmsCoilContractRelService.queryContractCoilStatistics(bo);
|
||||
return R.ok(list);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出合同挂接情况统计
|
||||
*/
|
||||
@Log(title = "合同挂接情况统计", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/statistics/export")
|
||||
public void statisticsExport(ContractCoilStatisticsBo bo, HttpServletResponse response) {
|
||||
List<ContractCoilStatisticsVo> list = iWmsCoilContractRelService.queryContractCoilStatistics(bo);
|
||||
ExcelUtil.exportExcel(list, "合同挂接情况统计", ContractCoilStatisticsVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除钢卷与合同关联关系
|
||||
*
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.klp.domain.bo;
|
||||
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* 合同挂接情况统计查询对象
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-06-30
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class ContractCoilStatisticsBo extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 合同号 */
|
||||
private String contractCode;
|
||||
|
||||
/** 合同名称 */
|
||||
private String contractName;
|
||||
|
||||
/** 需方(客户) */
|
||||
private String customer;
|
||||
|
||||
/** 销售员 */
|
||||
private String salesman;
|
||||
|
||||
/** 合同状态 0=草稿 1=生效 2=作废 3=已完成 */
|
||||
private Long status;
|
||||
|
||||
/** 订单编号 */
|
||||
private String orderCode;
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package com.klp.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 合同挂接情况统计视图对象
|
||||
* 基于 crm_order + wms_coil_contract_rel + wms_material_coil 三表联合统计
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-06-30
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class ContractCoilStatisticsVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
// ========== 合同信息(来自 crm_order)==========
|
||||
|
||||
/** 订单ID */
|
||||
@ExcelProperty(value = "订单ID")
|
||||
private Long orderId;
|
||||
|
||||
/** 订单编号 */
|
||||
@ExcelProperty(value = "订单编号")
|
||||
private String orderCode;
|
||||
|
||||
/** 合同号 */
|
||||
@ExcelProperty(value = "合同号")
|
||||
private String contractCode;
|
||||
|
||||
/** 合同名称 */
|
||||
@ExcelProperty(value = "合同名称")
|
||||
private String contractName;
|
||||
|
||||
/** 需方(客户) */
|
||||
@ExcelProperty(value = "需方")
|
||||
private String customer;
|
||||
|
||||
/** 供方 */
|
||||
@ExcelProperty(value = "供方")
|
||||
private String supplier;
|
||||
|
||||
/** 销售员 */
|
||||
@ExcelProperty(value = "销售员")
|
||||
private String salesman;
|
||||
|
||||
/** 合同状态 0=草稿 1=生效 2=作废 3=已完成 */
|
||||
@ExcelProperty(value = "合同状态")
|
||||
private Long status;
|
||||
|
||||
/** 订单总额 */
|
||||
@ExcelProperty(value = "订单总额")
|
||||
private BigDecimal orderAmount;
|
||||
|
||||
/** 签订时间 */
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@ExcelProperty(value = "签订时间")
|
||||
private Date signTime;
|
||||
|
||||
/** 交货日期 */
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@ExcelProperty(value = "交货日期")
|
||||
private Date deliveryDate;
|
||||
|
||||
// ========== 统计字段 ==========
|
||||
|
||||
/** 挂接钢卷数量 */
|
||||
@ExcelProperty(value = "挂接钢卷数")
|
||||
private Long coilCount;
|
||||
|
||||
/** 钢卷总净重(kg) */
|
||||
@ExcelProperty(value = "钢卷总净重(kg)")
|
||||
private BigDecimal totalNetWeight;
|
||||
|
||||
/** 钢卷总毛重(kg) */
|
||||
@ExcelProperty(value = "钢卷总毛重(kg)")
|
||||
private BigDecimal totalGrossWeight;
|
||||
}
|
||||
@@ -2,6 +2,8 @@ package com.klp.mapper;
|
||||
|
||||
import com.klp.domain.WmsCoilContractRel;
|
||||
import com.klp.domain.vo.WmsCoilContractRelVo;
|
||||
import com.klp.domain.vo.ContractCoilStatisticsVo;
|
||||
import com.klp.domain.bo.ContractCoilStatisticsBo;
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
@@ -34,4 +36,9 @@ public interface WmsCoilContractRelMapper extends BaseMapperPlus<WmsCoilContract
|
||||
* 根据订单ID查询合同信息(业务员姓名 + 合同编号)
|
||||
*/
|
||||
java.util.Map<String, String> selectContractInfoByOrderId(@Param("orderId") Long orderId);
|
||||
|
||||
/**
|
||||
* 查询合同挂接钢卷统计(按合同分组统计钢卷数量和重量)
|
||||
*/
|
||||
List<ContractCoilStatisticsVo> selectContractCoilStatistics(@Param("bo") ContractCoilStatisticsBo bo);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,9 @@ package com.klp.service;
|
||||
|
||||
import com.klp.domain.WmsCoilContractRel;
|
||||
import com.klp.domain.vo.WmsCoilContractRelVo;
|
||||
import com.klp.domain.vo.ContractCoilStatisticsVo;
|
||||
import com.klp.domain.bo.WmsCoilContractRelBo;
|
||||
import com.klp.domain.bo.ContractCoilStatisticsBo;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
|
||||
@@ -55,4 +57,12 @@ public interface IWmsCoilContractRelService {
|
||||
* @return 实际更新的记录数
|
||||
*/
|
||||
int batchUpdateContractId(Long contractId, List<Long> coilIds);
|
||||
|
||||
/**
|
||||
* 查询合同挂接钢卷统计
|
||||
*
|
||||
* @param bo 查询参数
|
||||
* @return 统计列表
|
||||
*/
|
||||
List<ContractCoilStatisticsVo> queryContractCoilStatistics(ContractCoilStatisticsBo bo);
|
||||
}
|
||||
|
||||
@@ -11,7 +11,9 @@ import com.klp.common.utils.StringUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.domain.bo.WmsCoilContractRelBo;
|
||||
import com.klp.domain.bo.ContractCoilStatisticsBo;
|
||||
import com.klp.domain.vo.WmsCoilContractRelVo;
|
||||
import com.klp.domain.vo.ContractCoilStatisticsVo;
|
||||
import com.klp.domain.WmsCoilContractRel;
|
||||
import com.klp.domain.WmsMaterialCoil;
|
||||
import com.klp.mapper.WmsCoilContractRelMapper;
|
||||
@@ -195,4 +197,12 @@ public class WmsCoilContractRelServiceImpl implements IWmsCoilContractRelService
|
||||
}
|
||||
return updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询合同挂接钢卷统计
|
||||
*/
|
||||
@Override
|
||||
public List<ContractCoilStatisticsVo> queryContractCoilStatistics(ContractCoilStatisticsBo bo) {
|
||||
return baseMapper.selectContractCoilStatistics(bo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -154,4 +154,49 @@
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 合同挂接钢卷统计:LEFT JOIN 合同 + 关联表 + 钢卷,按合同分组统计 -->
|
||||
<select id="selectContractCoilStatistics" resultType="com.klp.domain.vo.ContractCoilStatisticsVo">
|
||||
SELECT
|
||||
co.order_id AS orderId,
|
||||
co.order_code AS orderCode,
|
||||
co.contract_code AS contractCode,
|
||||
co.contract_name AS contractName,
|
||||
co.customer,
|
||||
co.supplier,
|
||||
co.salesman,
|
||||
co.status,
|
||||
co.order_amount AS orderAmount,
|
||||
co.sign_time AS signTime,
|
||||
co.delivery_date AS deliveryDate,
|
||||
COUNT(rel.coil_id) AS coilCount,
|
||||
IFNULL(SUM(mc.net_weight), 0) AS totalNetWeight,
|
||||
IFNULL(SUM(mc.gross_weight), 0) AS totalGrossWeight
|
||||
FROM crm_order co
|
||||
LEFT JOIN wms_coil_contract_rel rel ON co.order_id = rel.contract_id AND rel.del_flag = 0
|
||||
LEFT JOIN wms_material_coil mc ON rel.coil_id = mc.coil_id AND mc.del_flag = 0
|
||||
WHERE co.del_flag = 0
|
||||
<if test="bo.contractCode != null and bo.contractCode != ''">
|
||||
AND co.contract_code LIKE CONCAT('%', #{bo.contractCode}, '%')
|
||||
</if>
|
||||
<if test="bo.contractName != null and bo.contractName != ''">
|
||||
AND co.contract_name LIKE CONCAT('%', #{bo.contractName}, '%')
|
||||
</if>
|
||||
<if test="bo.customer != null and bo.customer != ''">
|
||||
AND co.customer LIKE CONCAT('%', #{bo.customer}, '%')
|
||||
</if>
|
||||
<if test="bo.salesman != null and bo.salesman != ''">
|
||||
AND co.salesman LIKE CONCAT('%', #{bo.salesman}, '%')
|
||||
</if>
|
||||
<if test="bo.status != null">
|
||||
AND co.status = #{bo.status}
|
||||
</if>
|
||||
<if test="bo.orderCode != null and bo.orderCode != ''">
|
||||
AND co.order_code LIKE CONCAT('%', #{bo.orderCode}, '%')
|
||||
</if>
|
||||
GROUP BY co.order_id, co.order_code, co.contract_code, co.contract_name,
|
||||
co.customer, co.supplier, co.salesman, co.status,
|
||||
co.order_amount, co.sign_time, co.delivery_date
|
||||
ORDER BY coilCount DESC, co.order_id ASC
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user