Commit e0e76314 by 杨浩

供应商信用评分

parent a6abc1df
...@@ -17,6 +17,9 @@ public class ErpSupplierPageReqVO extends PageParam { ...@@ -17,6 +17,9 @@ public class ErpSupplierPageReqVO extends PageParam {
@Schema(description = "id集合") @Schema(description = "id集合")
private List<Long> idList; private List<Long> idList;
@Schema(description = "id")
private Long id;
@Schema(description = "供应商名称", example = "芋道源码") @Schema(description = "供应商名称", example = "芋道源码")
private String name; private String name;
......
package cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.foodnexus.framework.excel.core.annotations.DictFormat;
import cn.iocoder.foodnexus.framework.excel.core.convert.DictConvert;
import cn.iocoder.foodnexus.module.system.enums.DictTypeConstants;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - ERP 供应商 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ErpSupplierSimpleRespVO {
@Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17791")
@ExcelProperty("供应商编号")
private Long id;
@Schema(description = "供应商名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码")
@ExcelProperty("供应商名称")
private String name;
@Schema(description = "联系人", example = "芋艿")
@ExcelProperty("联系人")
private String contact;
@Schema(description = "手机号码", example = "15601691300")
@ExcelProperty("手机号码")
private String mobile;
@Schema(description = "联系电话", example = "18818288888")
@ExcelProperty("联系电话")
private String telephone;
@Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@ExcelProperty(value = "开启状态", converter = DictConvert.class)
@DictFormat(DictTypeConstants.COMMON_STATUS)
private Integer status;
@Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
@ExcelProperty("排序")
private Integer sort;
@Schema(description = "统一社会信用代码")
private String unifiedSocialCreditCode;
/**
* 关联部门id
*/
private Long systemDeptId;
}
...@@ -11,5 +11,4 @@ import lombok.Data; ...@@ -11,5 +11,4 @@ import lombok.Data;
public class SupplierScoringWeightRespVO { public class SupplierScoringWeightRespVO {
} }
...@@ -20,6 +20,7 @@ public interface ErpSupplierMapper extends BaseMapperX<ErpSupplierDO> { ...@@ -20,6 +20,7 @@ public interface ErpSupplierMapper extends BaseMapperX<ErpSupplierDO> {
default PageResult<ErpSupplierDO> selectPage(ErpSupplierPageReqVO reqVO) { default PageResult<ErpSupplierDO> selectPage(ErpSupplierPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ErpSupplierDO>() return selectPage(reqVO, new LambdaQueryWrapperX<ErpSupplierDO>()
.eqIfPresent(ErpSupplierDO::getId, reqVO.getId())
.likeIfPresent(ErpSupplierDO::getName, reqVO.getName()) .likeIfPresent(ErpSupplierDO::getName, reqVO.getName())
.inIfPresent(ErpSupplierDO::getId, reqVO.getIdList()) .inIfPresent(ErpSupplierDO::getId, reqVO.getIdList())
.likeIfPresent(ErpSupplierDO::getMobile, reqVO.getMobile()) .likeIfPresent(ErpSupplierDO::getMobile, reqVO.getMobile())
......
...@@ -67,4 +67,6 @@ public interface ScoringWeightService { ...@@ -67,4 +67,6 @@ public interface ScoringWeightService {
* @param reqVO * @param reqVO
*/ */
void edit(ScoringWeightEditReqVO reqVO); void edit(ScoringWeightEditReqVO reqVO);
List<ScoringWeightDO> listAll();
} }
\ No newline at end of file
...@@ -118,4 +118,10 @@ public class ScoringWeightServiceImpl implements ScoringWeightService { ...@@ -118,4 +118,10 @@ public class ScoringWeightServiceImpl implements ScoringWeightService {
scoringWeightMapper.updateBatch(scoringWeightDOS); scoringWeightMapper.updateBatch(scoringWeightDOS);
} }
@Override
public List<ScoringWeightDO> listAll() {
return scoringWeightMapper.selectList(Wrappers.<ScoringWeightDO>lambdaQuery()
.orderByAsc(ScoringWeightDO::getSort));
}
} }
\ No newline at end of file
...@@ -36,11 +36,11 @@ public class AppCustomerReturnOrderReqVO { ...@@ -36,11 +36,11 @@ public class AppCustomerReturnOrderReqVO {
*/ */
@NotNull(message = "退货子项不能为空") @NotNull(message = "退货子项不能为空")
@Size(min = 1, message = "退货子项不能为空") @Size(min = 1, message = "退货子项不能为空")
private List<Item> orderItems; private List<ReturnItems> orderItems;
@Data @Data
public static class Item { public static class ReturnItems {
/** /**
* 客户订单子项id * 客户订单子项id
......
...@@ -38,14 +38,14 @@ public class CheckTaskCheckReqVO { ...@@ -38,14 +38,14 @@ public class CheckTaskCheckReqVO {
@Valid @Valid
@NotNull(message = "质检清单不能为空") @NotNull(message = "质检清单不能为空")
@Size(min = 1, message = "质检清单不能为空") @Size(min = 1, message = "质检清单不能为空")
private List<Item> items; private List<CheckItems> items;
@Schema(description = "供应商评价") @Schema(description = "供应商评价")
@Valid @Valid
private CheckTaskSupplierScoreReqVO score; private CheckTaskSupplierScoreReqVO score;
@Data @Data
public static class Item { public static class CheckItems {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "5717") @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "5717")
@NotNull(message = "items.id不能为空") @NotNull(message = "items.id不能为空")
......
...@@ -29,7 +29,7 @@ import cn.iocoder.foodnexus.module.order.controller.admin.orderScore.vo.*; ...@@ -29,7 +29,7 @@ import cn.iocoder.foodnexus.module.order.controller.admin.orderScore.vo.*;
import cn.iocoder.foodnexus.module.order.dal.dataobject.orderScore.OrderScoreDO; import cn.iocoder.foodnexus.module.order.dal.dataobject.orderScore.OrderScoreDO;
import cn.iocoder.foodnexus.module.order.service.orderScore.OrderScoreService; import cn.iocoder.foodnexus.module.order.service.orderScore.OrderScoreService;
@Tag(name = "管理后台 - 供应商评价") @Tag(name = "管理后台 - 供应商信用评分")
@RestController @RestController
@RequestMapping("/order/score") @RequestMapping("/order/score")
@Validated @Validated
......
...@@ -18,6 +18,9 @@ public class OrderScoreSupplierPageReqVO extends PageParam { ...@@ -18,6 +18,9 @@ public class OrderScoreSupplierPageReqVO extends PageParam {
@NotNull(message = "评分年度不能为空") @NotNull(message = "评分年度不能为空")
private String year; private String year;
@Schema(description = "供应商id")
private Long id;
@Schema(description = "供应商名称", example = "芋道源码") @Schema(description = "供应商名称", example = "芋道源码")
private String name; private String name;
......
package cn.iocoder.foodnexus.module.order.controller.admin.orderScore.vo; package cn.iocoder.foodnexus.module.order.controller.admin.orderScore.vo;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier.ErpSupplierRespVO; import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier.ErpSupplierRespVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier.ErpSupplierSimpleRespVO;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
...@@ -22,7 +23,7 @@ public class OrderScoreSupplierRespVO { ...@@ -22,7 +23,7 @@ public class OrderScoreSupplierRespVO {
private Long supplierId; private Long supplierId;
@Schema(description = "供应商信息") @Schema(description = "供应商信息")
private ErpSupplierRespVO supplierInfo; private ErpSupplierSimpleRespVO supplierInfo;
@Schema(description = "评分维度得分") @Schema(description = "评分维度得分")
private List<ScoreItems> scoreItems; private List<ScoreItems> scoreItems;
......
...@@ -451,7 +451,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -451,7 +451,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
returnSaveReqVO.setRemark(reqVO.getRemark()); returnSaveReqVO.setRemark(reqVO.getRemark());
returnSaveReqVO.setFilesUrl(reqVO.getRemarkFiles()); returnSaveReqVO.setFilesUrl(reqVO.getRemarkFiles());
List<ErpSaleReturnSaveReqVO.Item> items = new ArrayList<>(reqVO.getOrderItems().size()); List<ErpSaleReturnSaveReqVO.Item> items = new ArrayList<>(reqVO.getOrderItems().size());
for (AppCustomerReturnOrderReqVO.Item item : reqVO.getOrderItems()) { for (AppCustomerReturnOrderReqVO.ReturnItems item : reqVO.getOrderItems()) {
CustomerOrderItemDO customerOrderItemDO = orderItemMap.get(item.getCustomerOrderItemId()); CustomerOrderItemDO customerOrderItemDO = orderItemMap.get(item.getCustomerOrderItemId());
if (!Objects.equals(customerOrderItemDO.getProductId(), item.getProductId())) { if (!Objects.equals(customerOrderItemDO.getProductId(), item.getProductId())) {
throw exception(CUSTOMER_ORDER_RETURN_PRODUCT_ERROR); throw exception(CUSTOMER_ORDER_RETURN_PRODUCT_ERROR);
......
package cn.iocoder.foodnexus.module.order.service.orderScore; package cn.iocoder.foodnexus.module.order.service.orderScore;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum;
import cn.iocoder.foodnexus.framework.common.pojo.CommonResult; import cn.iocoder.foodnexus.framework.common.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier.ErpSupplierPageReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier.ErpSupplierPageReqVO;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.supplier.ErpSupplierSimpleRespVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpSupplierDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpSupplierDO;
import cn.iocoder.foodnexus.module.erp.service.purchase.ErpSupplierService; import cn.iocoder.foodnexus.module.erp.service.purchase.ErpSupplierService;
import cn.iocoder.foodnexus.module.operations.dal.dataobject.scoringweight.ScoringWeightDO;
import cn.iocoder.foodnexus.module.operations.service.scoringweight.ScoringWeightService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -13,7 +18,13 @@ import jakarta.annotation.Resource; ...@@ -13,7 +18,13 @@ import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import cn.iocoder.foodnexus.module.order.controller.admin.orderScore.vo.*; import cn.iocoder.foodnexus.module.order.controller.admin.orderScore.vo.*;
import cn.iocoder.foodnexus.module.order.dal.dataobject.orderScore.OrderScoreDO; import cn.iocoder.foodnexus.module.order.dal.dataobject.orderScore.OrderScoreDO;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
...@@ -42,6 +53,9 @@ public class OrderScoreServiceImpl implements OrderScoreService { ...@@ -42,6 +53,9 @@ public class OrderScoreServiceImpl implements OrderScoreService {
@Autowired @Autowired
private ErpSupplierService supplierService; private ErpSupplierService supplierService;
@Autowired
private ScoringWeightService scoringWeightService;
@Override @Override
public Long createScore(OrderScoreSaveReqVO createReqVO) { public Long createScore(OrderScoreSaveReqVO createReqVO) {
// 插入 // 插入
...@@ -111,10 +125,92 @@ public class OrderScoreServiceImpl implements OrderScoreService { ...@@ -111,10 +125,92 @@ public class OrderScoreServiceImpl implements OrderScoreService {
public PageResult<OrderScoreSupplierRespVO> supplierPage(OrderScoreSupplierPageReqVO pageReqVO) { public PageResult<OrderScoreSupplierRespVO> supplierPage(OrderScoreSupplierPageReqVO pageReqVO) {
PageResult<ErpSupplierDO> supplierPage = supplierService.getSupplierPage(BeanUtils.toBean(pageReqVO, ErpSupplierPageReqVO.class)); PageResult<ErpSupplierDO> supplierPage = supplierService.getSupplierPage(BeanUtils.toBean(pageReqVO, ErpSupplierPageReqVO.class));
if (CommonUtil.isNotEmpty(supplierPage.getList())) { if (CommonUtil.isNotEmpty(supplierPage.getList())) {
Set<Long> supplierIds = CommonUtil.listConvertSet(supplierPage.getList(), ErpSupplierDO::getId); Map<Long, ErpSupplierDO> supplierMap = CommonUtil.listConvertMap(supplierPage.getList(), ErpSupplierDO::getId);
// scoreMapper. List<ScoringWeightDO> scoringWeightDOS = scoringWeightService.listAll();
Map<Long, ScoringWeightDO> scoringWeightMap = CommonUtil.listConvertMap(scoringWeightDOS, ScoringWeightDO::getId);
List<OrderScoreSupplierRespVO> resultList = new ArrayList<>();
// 解析年份
int year = Integer.parseInt(pageReqVO.getYear());
// 当年的第一天 00:00:00
LocalDateTime startOfYear = LocalDateTime.of(year, 1, 1, 0, 0, 0);
// 当年的最后一天 23:59:59.999999999
LocalDateTime endOfYear = LocalDateTime.of(year, 12, 1, 23, 59, 59)
.with(TemporalAdjusters.lastDayOfMonth())
.withNano(999_999_999);
for (Map.Entry<Long, ErpSupplierDO> e : supplierMap.entrySet()) {
BigDecimal finalScore = BigDecimal.ZERO;
Long supplierId = e.getKey();
ErpSupplierDO supplierInfo = e.getValue();
List<OrderScoreSupplierRespVO.ScoreItems> items = new ArrayList<>();
OrderScoreSupplierRespVO orderScoreSupplier = new OrderScoreSupplierRespVO();
orderScoreSupplier.setYear(pageReqVO.getYear());
orderScoreSupplier.setSupplierId(supplierId);
orderScoreSupplier.setSupplierInfo(BeanUtil.toBean(supplierInfo, ErpSupplierSimpleRespVO.class));
List<OrderScoreDO> orderScores = scoreMapper.selectList(Wrappers.<OrderScoreDO>lambdaQuery()
.eq(OrderScoreDO::getSupplierId, supplierId)
.between(OrderScoreDO::getCreateTime, startOfYear, endOfYear));
Map<Long, List<OrderScoreDO>> scoreSupplierMap = CommonUtil.listConvertListMap(orderScores, OrderScoreDO::getScoreId);
for (Map.Entry<Long, ScoringWeightDO> entry : scoringWeightMap.entrySet()) {
Long scoreId = entry.getKey();
ScoringWeightDO scoreInfo = entry.getValue();
OrderScoreSupplierRespVO.ScoreItems scoreItem = new OrderScoreSupplierRespVO.ScoreItems();
List<OrderScoreDO> supplierScores = scoreSupplierMap.get(scoreId);
if (CommonUtil.isNotEmpty(supplierScores)) {
scoreItem.setAllScore(supplierScores.stream().mapToInt(OrderScoreDO::getScore).sum());
scoreItem.setScoreCount(supplierScores.size());
scoreItem.setScore(this.divideInts(scoreItem.getAllScore(), scoreItem.getScoreCount()));
}
scoreItem.setScoreId(scoreId);
scoreItem.setScoreName(scoreInfo.getScoreName() + "(" + UserSystemEnum.getByKey(scoreInfo.getUserSystem()).getLabel() + ")");
items.add(scoreItem);
if (CommonUtil.isNotEmpty(scoreItem.getScore()) && scoreInfo.getWeightRatio().compareTo(BigDecimal.ZERO) > 0) {
finalScore = finalScore.add(this.calculate(scoreItem.getScore(), scoreInfo.getWeightRatio()));
}
}
orderScoreSupplier.setScoreItems(items);
orderScoreSupplier.setFinalScore(finalScore);
resultList.add(orderScoreSupplier);
}
return new PageResult<>(resultList, supplierPage.getTotal());
} }
return null; return null;
} }
public BigDecimal divideInts(int num1, int num2) {
// 处理除数为0的情况
if (num2 == 0) {
return BigDecimal.ZERO;
}
// 将int转换为BigDecimal
BigDecimal dividend = BigDecimal.valueOf(num1);
BigDecimal divisor = BigDecimal.valueOf(num2);
// 相除并保留两位小数,使用四舍五入模式
return dividend.divide(divisor, 2, RoundingMode.HALF_UP);
}
public BigDecimal calculate(BigDecimal num1, BigDecimal num2) {
// 处理空值情况
if (num1 == null || num2 == null) {
return BigDecimal.ZERO;
}
// 1. 乘法运算
BigDecimal product = num1.multiply(num2);
// 2. 除以100,保留两位小数,使用四舍五入模式
BigDecimal result = product.divide(
new BigDecimal("100"), // 除数100
2, // 保留两位小数
RoundingMode.HALF_UP // 四舍五入模式
);
return result;
}
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment