Commit e0e76314 by 杨浩

供应商信用评分

parent a6abc1df
......@@ -17,6 +17,9 @@ public class ErpSupplierPageReqVO extends PageParam {
@Schema(description = "id集合")
private List<Long> idList;
@Schema(description = "id")
private Long id;
@Schema(description = "供应商名称", example = "芋道源码")
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;
}
......@@ -20,6 +20,7 @@ public interface ErpSupplierMapper extends BaseMapperX<ErpSupplierDO> {
default PageResult<ErpSupplierDO> selectPage(ErpSupplierPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ErpSupplierDO>()
.eqIfPresent(ErpSupplierDO::getId, reqVO.getId())
.likeIfPresent(ErpSupplierDO::getName, reqVO.getName())
.inIfPresent(ErpSupplierDO::getId, reqVO.getIdList())
.likeIfPresent(ErpSupplierDO::getMobile, reqVO.getMobile())
......
......@@ -67,4 +67,6 @@ public interface ScoringWeightService {
* @param reqVO
*/
void edit(ScoringWeightEditReqVO reqVO);
List<ScoringWeightDO> listAll();
}
\ No newline at end of file
......@@ -118,4 +118,10 @@ public class ScoringWeightServiceImpl implements ScoringWeightService {
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 {
*/
@NotNull(message = "退货子项不能为空")
@Size(min = 1, message = "退货子项不能为空")
private List<Item> orderItems;
private List<ReturnItems> orderItems;
@Data
public static class Item {
public static class ReturnItems {
/**
* 客户订单子项id
......
......@@ -38,14 +38,14 @@ public class CheckTaskCheckReqVO {
@Valid
@NotNull(message = "质检清单不能为空")
@Size(min = 1, message = "质检清单不能为空")
private List<Item> items;
private List<CheckItems> items;
@Schema(description = "供应商评价")
@Valid
private CheckTaskSupplierScoreReqVO score;
@Data
public static class Item {
public static class CheckItems {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "5717")
@NotNull(message = "items.id不能为空")
......
......@@ -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.service.orderScore.OrderScoreService;
@Tag(name = "管理后台 - 供应商评价")
@Tag(name = "管理后台 - 供应商信用评分")
@RestController
@RequestMapping("/order/score")
@Validated
......
......@@ -18,6 +18,9 @@ public class OrderScoreSupplierPageReqVO extends PageParam {
@NotNull(message = "评分年度不能为空")
private String year;
@Schema(description = "供应商id")
private Long id;
@Schema(description = "供应商名称", example = "芋道源码")
private String name;
......
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.ErpSupplierSimpleRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
......@@ -22,7 +23,7 @@ public class OrderScoreSupplierRespVO {
private Long supplierId;
@Schema(description = "供应商信息")
private ErpSupplierRespVO supplierInfo;
private ErpSupplierSimpleRespVO supplierInfo;
@Schema(description = "评分维度得分")
private List<ScoreItems> scoreItems;
......
......@@ -451,7 +451,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
returnSaveReqVO.setRemark(reqVO.getRemark());
returnSaveReqVO.setFilesUrl(reqVO.getRemarkFiles());
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());
if (!Objects.equals(customerOrderItemDO.getProductId(), item.getProductId())) {
throw exception(CUSTOMER_ORDER_RETURN_PRODUCT_ERROR);
......
package cn.iocoder.foodnexus.module.order.service.orderScore;
import cn.hutool.core.bean.BeanUtil;
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.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.ErpSupplierSimpleRespVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpSupplierDO;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -13,7 +18,13 @@ import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
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.stream.Collectors;
import cn.iocoder.foodnexus.module.order.controller.admin.orderScore.vo.*;
import cn.iocoder.foodnexus.module.order.dal.dataobject.orderScore.OrderScoreDO;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
......@@ -42,6 +53,9 @@ public class OrderScoreServiceImpl implements OrderScoreService {
@Autowired
private ErpSupplierService supplierService;
@Autowired
private ScoringWeightService scoringWeightService;
@Override
public Long createScore(OrderScoreSaveReqVO createReqVO) {
// 插入
......@@ -111,10 +125,92 @@ public class OrderScoreServiceImpl implements OrderScoreService {
public PageResult<OrderScoreSupplierRespVO> supplierPage(OrderScoreSupplierPageReqVO pageReqVO) {
PageResult<ErpSupplierDO> supplierPage = supplierService.getSupplierPage(BeanUtils.toBean(pageReqVO, ErpSupplierPageReqVO.class));
if (CommonUtil.isNotEmpty(supplierPage.getList())) {
Set<Long> supplierIds = CommonUtil.listConvertSet(supplierPage.getList(), ErpSupplierDO::getId);
// scoreMapper.
Map<Long, ErpSupplierDO> supplierMap = CommonUtil.listConvertMap(supplierPage.getList(), ErpSupplierDO::getId);
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;
}
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