diff --git a/njzscloud-svr/pom.xml b/njzscloud-svr/pom.xml index 16702cd..78fc533 100644 --- a/njzscloud-svr/pom.xml +++ b/njzscloud-svr/pom.xml @@ -88,7 +88,11 @@ org.hibernate.validator hibernate-validator - + + com.google.zxing + core + 3.5.3 + cn.hutool hutool-all diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/controller/DriverController.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/controller/DriverController.java index caae2d7..c167372 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/controller/DriverController.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/controller/DriverController.java @@ -5,6 +5,7 @@ import com.njzscloud.common.mp.support.PageParam; import com.njzscloud.common.mp.support.PageResult; import com.njzscloud.dispose.cst.driver.pojo.entity.DriverEntity; import com.njzscloud.dispose.cst.driver.pojo.param.DriverQueryParam; +import com.njzscloud.dispose.cst.driver.pojo.param.QRCodeParam; import com.njzscloud.dispose.cst.driver.pojo.result.DriverResult; import com.njzscloud.dispose.cst.driver.service.DriverService; import lombok.RequiredArgsConstructor; @@ -15,6 +16,7 @@ import java.util.List; /** * 司机 + * * @author ljw */ @Slf4j @@ -67,6 +69,15 @@ public class DriverController { public R> paging(PageParam pageParam, DriverQueryParam queryParam) { return R.success(driverService.paging(pageParam, queryParam)); } + + /** + * 获取二维码 + */ + @GetMapping("/getCode") + public R getCode(QRCodeParam codeParam) { + return R.success(driverService.getCode(codeParam)); + } + } diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/pojo/param/QRCodeParam.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/pojo/param/QRCodeParam.java new file mode 100644 index 0000000..6f0025d --- /dev/null +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/pojo/param/QRCodeParam.java @@ -0,0 +1,37 @@ +package com.njzscloud.dispose.cst.driver.pojo.param; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * @author ljw + */ +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class QRCodeParam { + + /** + * 内容 + */ + private String content; + + /** + * 二维码宽度 + */ + private Integer width; + + /** + * 二维码高度 + */ + private Integer height; + + /** + * 二维码图片类型,jpg 或 png + */ + private String imgType; + +} diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/service/DriverService.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/service/DriverService.java index e271201..c707bd1 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/service/DriverService.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/service/DriverService.java @@ -5,12 +5,14 @@ import com.njzscloud.common.mp.support.PageParam; import com.njzscloud.common.mp.support.PageResult; import com.njzscloud.dispose.cst.driver.pojo.entity.DriverEntity; import com.njzscloud.dispose.cst.driver.pojo.param.DriverQueryParam; +import com.njzscloud.dispose.cst.driver.pojo.param.QRCodeParam; import com.njzscloud.dispose.cst.driver.pojo.result.DriverResult; import java.util.List; /** * 司机 + * * @author ljw */ public interface DriverService extends IService { @@ -24,6 +26,9 @@ public interface DriverService extends IService { DriverResult detail(Long id); PageResult paging(PageParam pageParam, DriverQueryParam queryParam); + + String getCode(QRCodeParam codeParam); + } diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/service/impl/DriverServiceImpl.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/service/impl/DriverServiceImpl.java index 4e84b02..d9608be 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/service/impl/DriverServiceImpl.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/driver/service/impl/DriverServiceImpl.java @@ -1,10 +1,14 @@ package com.njzscloud.dispose.cst.driver.service.impl; +import cn.hutool.core.img.ImgUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.qrcode.QrCodeUtil; +import cn.hutool.extra.qrcode.QrConfig; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.base.Strings; import com.njzscloud.common.core.ex.Exceptions; import com.njzscloud.common.mp.support.PageParam; import com.njzscloud.common.mp.support.PageResult; @@ -13,6 +17,7 @@ import com.njzscloud.dispose.cst.customer.pojo.entity.CustomerEntity; import com.njzscloud.dispose.cst.driver.mapper.DriverMapper; import com.njzscloud.dispose.cst.driver.pojo.entity.DriverEntity; import com.njzscloud.dispose.cst.driver.pojo.param.DriverQueryParam; +import com.njzscloud.dispose.cst.driver.pojo.param.QRCodeParam; import com.njzscloud.dispose.cst.driver.pojo.result.DriverResult; import com.njzscloud.dispose.cst.driver.service.DriverService; import lombok.RequiredArgsConstructor; @@ -88,4 +93,23 @@ public class DriverServiceImpl extends ServiceImpl i return PageResult.of(baseMapper.paging(pageParam.toPage(), ew)); } + + @Override + public String getCode(QRCodeParam codeParam) { + Integer width = codeParam.getWidth(); + Integer height = codeParam.getHeight(); + if (width == null) { + width = 300; + } + if (height == null) { + height = 300; + } + String imgType = codeParam.getImgType(); + if (Strings.isNullOrEmpty(imgType)) { + imgType = ImgUtil.IMAGE_TYPE_JPG; + } + + return QrCodeUtil.generateAsBase64(codeParam.getContent(), new QrConfig(width, height), imgType); + + } } diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/controller/OrderEvaluateController.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/controller/OrderEvaluateController.java new file mode 100644 index 0000000..8940471 --- /dev/null +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/controller/OrderEvaluateController.java @@ -0,0 +1,79 @@ +package com.njzscloud.dispose.cst.order.controller; + +import com.njzscloud.common.core.utils.R; +import com.njzscloud.common.mp.support.PageParam; +import com.njzscloud.common.mp.support.PageResult; +import com.njzscloud.dispose.cst.order.pojo.entity.OrderEvaluateEntity; +import com.njzscloud.dispose.cst.order.pojo.param.CreateOrderEvaluateParam; +import com.njzscloud.dispose.cst.order.pojo.param.OrderEvaluateQueryParam; +import com.njzscloud.dispose.cst.order.service.OrderEvaluateService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 订单评价表 + * + * @author ljw + */ +@Slf4j +@RestController +@RequestMapping("/orderEvaluate") +@RequiredArgsConstructor +public class OrderEvaluateController { + + private final OrderEvaluateService orderEvaluateService; + + /** + * 新增 + */ + @PostMapping("/add") + public R add(@RequestBody CreateOrderEvaluateParam param) { + orderEvaluateService.add(param); + return R.success(); + } + + /** + * 修改 + */ + @PostMapping("/modify") + public R modify(@RequestBody OrderEvaluateEntity orderEvaluateEntity) { + orderEvaluateService.modify(orderEvaluateEntity); + return R.success(); + } + + /** + * 删除 + */ + @PostMapping("/del") + public R del(@RequestBody List ids) { + orderEvaluateService.del(ids); + return R.success(); + } + + /** + * 详情 + */ + @GetMapping("/detail") + public R detail(@RequestParam("id") Long id) { + return R.success(orderEvaluateService.detail(id)); + } + + /** + * 分页查询 + */ + @GetMapping("/paging") + public R> paging(PageParam pageParam, OrderEvaluateQueryParam queryParam) { + return R.success(orderEvaluateService.paging(pageParam, queryParam)); + } + + /** + * 根据订单ID查询评价 + */ + @GetMapping("/getByOrderId") + public R getByOrderId(@RequestParam("orderId") Long orderId) { + return R.success(orderEvaluateService.getByOrderId(orderId)); + } +} diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/mapper/OrderEvaluateMapper.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/mapper/OrderEvaluateMapper.java new file mode 100644 index 0000000..7d1082d --- /dev/null +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/mapper/OrderEvaluateMapper.java @@ -0,0 +1,14 @@ +package com.njzscloud.dispose.cst.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.njzscloud.dispose.cst.order.pojo.entity.OrderEvaluateEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单评价表 + * + * @author ljw + */ +@Mapper +public interface OrderEvaluateMapper extends BaseMapper { +} diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/pojo/entity/OrderEvaluateEntity.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/pojo/entity/OrderEvaluateEntity.java new file mode 100644 index 0000000..6ad7cc5 --- /dev/null +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/pojo/entity/OrderEvaluateEntity.java @@ -0,0 +1,122 @@ +package com.njzscloud.dispose.cst.order.pojo.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.njzscloud.common.mp.support.handler.j.JsonTypeHandler; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单评价表 + * + * @author ljw + */ +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName(value = "cst_order_evaluate", autoResultMap = true) +public class OrderEvaluateEntity { + + /** + * Id + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** + * 订单 Id + */ + private Long orderId; + + /** + * 订单编号 + */ + private String sn; + + /** + * 下单人 Id;sys_user.id + */ + private Long userId; + + /** + * 下单人客户 Id;cst_customer.id + */ + private Long customerId; + + /** + * 运输组织 Id;cst_org.id + */ + private Long transOrgId; + + /** + * 运输方客户 Id + */ + private Long transCustomerId; + + /** + * 服务效率分,满分5 + */ + private BigDecimal efficiencyScore; + + /** + * 费用透明分,满分5 + */ + private BigDecimal feeScore; + + /** + * 服务态度分,满分5 + */ + private BigDecimal attitudeScore; + + /** + * 综合分,满分5 + */ + private BigDecimal overallScore; + + /** + * 图片 + */ + @TableField(typeHandler = JsonTypeHandler.class) + private List picture; + + /** + * 评价内容 + */ + private String memo; + + /** + * 创建人 Id; sys_user.id + */ + @TableField(fill = FieldFill.INSERT) + private Long creatorId; + + /** + * 修改人 Id; sys_user.id + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Long modifierId; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 修改时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime modifyTime; + + /** + * 是否删除; 0-->未删除、1-->已删除 + */ + @TableLogic + private Boolean deleted; +} diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/pojo/param/CreateOrderEvaluateParam.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/pojo/param/CreateOrderEvaluateParam.java new file mode 100644 index 0000000..55d8ca1 --- /dev/null +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/pojo/param/CreateOrderEvaluateParam.java @@ -0,0 +1,69 @@ +package com.njzscloud.dispose.cst.order.pojo.param; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 新建订单评价参数 + * + * @author ljw + */ +@Data +public class CreateOrderEvaluateParam { + + /** + * 订单 Id + */ + private Long orderId; + + /** + * 订单编号 + */ + private String sn; + + /** + * 下单人 Id;sys_user.id + */ + private Long userId; + + /** + * 下单人客户 Id;cst_customer.id + */ + private Long customerId; + + /** + * 运输组织 Id;cst_org.id + */ + private Long transOrgId; + + /** + * 运输方客户 Id + */ + private Long transCustomerId; + + /** + * 服务效率分,满分5 + */ + private BigDecimal efficiencyScore; + + /** + * 费用透明分,满分5 + */ + private BigDecimal feeScore; + + /** + * 服务态度分,满分5 + */ + private BigDecimal attitudeScore; + + /** + * 图片 + */ + private String picture; + + /** + * 评价内容 + */ + private String memo; +} diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/pojo/param/OrderEvaluateQueryParam.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/pojo/param/OrderEvaluateQueryParam.java new file mode 100644 index 0000000..9a285ba --- /dev/null +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/pojo/param/OrderEvaluateQueryParam.java @@ -0,0 +1,64 @@ +package com.njzscloud.dispose.cst.order.pojo.param; + +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 订单评价查询参数 + * + * @author ljw + */ +@Data +public class OrderEvaluateQueryParam { + + /** + * 订单 Id + */ + private Long orderId; + + /** + * 订单编号(模糊查询) + */ + private String sn; + + /** + * 下单人 Id + */ + private Long userId; + + /** + * 下单人客户 Id + */ + private Long customerId; + + /** + * 运输组织 Id + */ + private Long transOrgId; + + /** + * 运输方客户 Id + */ + private Long transCustomerId; + + /** + * 服务效率分 + */ + private BigDecimal efficiencyScore; + + /** + * 费用透明分 + */ + private BigDecimal feeScore; + + /** + * 服务态度分 + */ + private BigDecimal attitudeScore; + + /** + * 综合分 + */ + private BigDecimal overallScore; +} diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/service/OrderEvaluateService.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/service/OrderEvaluateService.java new file mode 100644 index 0000000..c19881a --- /dev/null +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/cst/order/service/OrderEvaluateService.java @@ -0,0 +1,172 @@ +package com.njzscloud.dispose.cst.order.service; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.njzscloud.common.core.ex.Exceptions; +import com.njzscloud.common.mp.support.PageParam; +import com.njzscloud.common.mp.support.PageResult; +import com.njzscloud.dispose.cst.order.mapper.OrderEvaluateMapper; +import com.njzscloud.dispose.cst.order.pojo.entity.OrderEvaluateEntity; +import com.njzscloud.dispose.cst.order.pojo.param.CreateOrderEvaluateParam; +import com.njzscloud.dispose.cst.order.pojo.param.OrderEvaluateQueryParam; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; + +/** + * 订单评价表 + * + * @author ljw + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class OrderEvaluateService extends ServiceImpl { + + private final OrderEvaluateMapper orderEvaluateMapper; + + /** + * 新增订单评价 + * + * @param param 新增参数 + */ + @Transactional(rollbackFor = Exception.class) + public void add(CreateOrderEvaluateParam param) { + Assert.notNull(param, () -> Exceptions.clierr("请填写参数")); + Assert.notNull(param.getEfficiencyScore(), () -> Exceptions.clierr("服务效率分不可为空")); + Assert.notNull(param.getFeeScore(), () -> Exceptions.clierr("费用透明分不可为空")); + Assert.notNull(param.getAttitudeScore(), () -> Exceptions.clierr("服务态度分不可为空")); + + // 校验分数范围 + this.validateScore(param.getEfficiencyScore()); + this.validateScore(param.getFeeScore()); + this.validateScore(param.getAttitudeScore()); + + // 计算综合评分 = (费用透明分 + 服务效率分 + 服务态度分) / 3 + // 结果只能是0、0.5、1、1.5、2、2.5、3、3.5、4、4.5、5,有其他值时,向上取值 + BigDecimal overallScore = this.calculateOverallScore(param.getEfficiencyScore(), param.getFeeScore(), param.getAttitudeScore()); + + OrderEvaluateEntity entity = BeanUtil.copyProperties(param, OrderEvaluateEntity.class) + .setOverallScore(overallScore); + orderEvaluateMapper.insert(entity); + } + + /** + * 修改订单评价 + * + * @param orderEvaluateEntity 订单评价实体 + */ + @Transactional(rollbackFor = Exception.class) + public void modify(OrderEvaluateEntity orderEvaluateEntity) { + Assert.notNull(orderEvaluateEntity.getId(), () -> Exceptions.clierr("ID不可为空")); + + OrderEvaluateEntity existEntity = this.getById(orderEvaluateEntity.getId()); + Assert.notNull(existEntity, () -> Exceptions.clierr("评价记录不存在")); + + // 如果有评分字段更新,需要重新计算综合评分 + if (orderEvaluateEntity.getEfficiencyScore() != null || orderEvaluateEntity.getFeeScore() != null || orderEvaluateEntity.getAttitudeScore() != null) { + BigDecimal efficiencyScore = orderEvaluateEntity.getEfficiencyScore() != null ? orderEvaluateEntity.getEfficiencyScore() : existEntity.getEfficiencyScore(); + BigDecimal feeScore = orderEvaluateEntity.getFeeScore() != null ? orderEvaluateEntity.getFeeScore() : existEntity.getFeeScore(); + BigDecimal attitudeScore = orderEvaluateEntity.getAttitudeScore() != null ? orderEvaluateEntity.getAttitudeScore() : existEntity.getAttitudeScore(); + + // 校验分数范围 + this.validateScore(efficiencyScore); + this.validateScore(feeScore); + this.validateScore(attitudeScore); + + // 重新计算综合评分 + BigDecimal overallScore = this.calculateOverallScore(efficiencyScore, feeScore, attitudeScore); + orderEvaluateEntity.setOverallScore(overallScore); + } + + orderEvaluateMapper.updateById(orderEvaluateEntity); + } + + /** + * 删除订单评价 + * + * @param ids id集合 + */ + @Transactional(rollbackFor = Exception.class) + public void del(List ids) { + Assert.notEmpty(ids, () -> Exceptions.clierr("ID集合不可为空")); + this.removeBatchByIds(ids); + } + + /** + * 查询订单评价详情 + * + * @param id id + * @return 订单评价实体 + */ + public OrderEvaluateEntity detail(Long id) { + Assert.notNull(id, () -> Exceptions.clierr("ID不可为空")); + return this.getById(id); + } + + /** + * 分页查询订单评价 + * + * @param pageParam 分页参数 + * @param queryParam 查询参数 + * @return 分页结果 + */ + public PageResult paging(PageParam pageParam, OrderEvaluateQueryParam queryParam) { + return PageResult.of(this.page(pageParam.toPage(), Wrappers.lambdaQuery() + .eq(queryParam.getOrderId() != null, OrderEvaluateEntity::getOrderId, queryParam.getOrderId()) + .like(queryParam.getSn() != null, OrderEvaluateEntity::getSn, queryParam.getSn()) + .eq(queryParam.getUserId() != null, OrderEvaluateEntity::getUserId, queryParam.getUserId()) + .eq(queryParam.getCustomerId() != null, OrderEvaluateEntity::getCustomerId, queryParam.getCustomerId()) + .eq(queryParam.getTransOrgId() != null, OrderEvaluateEntity::getTransOrgId, queryParam.getTransOrgId()) + .eq(queryParam.getTransCustomerId() != null, OrderEvaluateEntity::getTransCustomerId, queryParam.getTransCustomerId()) + )); + } + + /** + * 根据订单ID查询评价 + * + * @param orderId 订单ID + * @return 订单评价 + */ + public OrderEvaluateEntity getByOrderId(Long orderId) { + Assert.notNull(orderId, () -> Exceptions.clierr("订单ID不可为空")); + return this.getOne(Wrappers.lambdaQuery() + .eq(OrderEvaluateEntity::getOrderId, orderId) + .eq(OrderEvaluateEntity::getDeleted, Boolean.FALSE)); + } + + /** + * 校验分数范围 + * + * @param score 分数 + */ + private void validateScore(BigDecimal score) { + Assert.notNull(score, () -> Exceptions.clierr("分数不可为空")); + Assert.isTrue(score.compareTo(BigDecimal.ZERO) >= 0 && score.compareTo(new BigDecimal("5")) <= 0, () -> Exceptions.clierr("分数必须在0-5之间")); + } + + /** + * 计算综合评分 + * 综合评分 = (费用透明分 + 服务效率分 + 服务态度分) / 3 + * 结果只能是0、0.5、1、1.5、2、2.5、3、3.5、4、4.5、5,有其他值时,向上取值 + * + * @param efficiencyScore 服务效率分 + * @param feeScore 费用透明分 + * @param attitudeScore 服务态度分 + * @return 综合评分 + */ + private BigDecimal calculateOverallScore(BigDecimal efficiencyScore, BigDecimal feeScore, BigDecimal attitudeScore) { + // 计算平均分(乘以2后向上取整,再除以2,实现0.5为步长的向上取整) + BigDecimal sum = efficiencyScore.add(feeScore).add(attitudeScore); + BigDecimal avgScore = sum.divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP); + // 向上取值到最近的0.5倍数 + return avgScore.multiply(new BigDecimal("2")).setScale(0, RoundingMode.CEILING).divide(new BigDecimal("2"), 1, RoundingMode.UNNECESSARY); + } +} diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/auth/pojo/result/MyResult.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/auth/pojo/result/MyResult.java index 0088bd2..970c56d 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/auth/pojo/result/MyResult.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/auth/pojo/result/MyResult.java @@ -8,6 +8,7 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Objects; @@ -67,6 +68,14 @@ public class MyResult extends UserDetail { * 邮箱 */ private String email; + /** + * 余额 + */ + private BigDecimal recharge; + /** + * 营收 + */ + private BigDecimal revenue; public IdentityInfo currentIdentity() { Optional identityInfo = identities.stream().filter(it -> Objects.equals(it.getCustomerId(), currentCustomerId)).findFirst(); diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/auth/service/AuthService.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/auth/service/AuthService.java index 10bb600..0ce06ff 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/auth/service/AuthService.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/sys/auth/service/AuthService.java @@ -10,6 +10,8 @@ import com.njzscloud.common.security.module.password.PasswordLoginForm; import com.njzscloud.common.security.module.wechat.mini.WechatMiniLoginForm; import com.njzscloud.common.security.support.IAuthService; import com.njzscloud.common.security.support.UserDetail; +import com.njzscloud.dispose.finance.mapper.MoneyAccountMapper; +import com.njzscloud.dispose.finance.pojo.entity.MoneyAccountEntity; import com.njzscloud.dispose.sys.auth.mapper.AuthMapper; import com.njzscloud.dispose.sys.auth.pojo.result.EndpointResource; import com.njzscloud.dispose.sys.auth.pojo.result.IdentityInfo; @@ -20,6 +22,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.List; import java.util.Set; @@ -34,6 +37,7 @@ import static com.njzscloud.common.security.contant.Constants.ROLE_AUTHENTICATED @RequiredArgsConstructor public class AuthService implements IAuthService { private final AuthMapper authMapper; + private final MoneyAccountMapper moneyAccountMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -79,6 +83,9 @@ public class AuthService implements IAuthService { List endpointResources = authMapper.selectUserEndpoint(userId); List identityInfoList = authMapper.selectUserIdentity(userId); Long currentCustomerId = null; + MoneyAccountEntity moneyAccount = moneyAccountMapper.selectOne(Wrappers.lambdaQuery() + .eq(MoneyAccountEntity::getUserId, userId) + .eq(MoneyAccountEntity::getDeleted, Boolean.FALSE)); if (CollUtil.isNotEmpty(identityInfoList)) { IdentityInfo identityInfo = identityInfoList.getFirst(); @@ -88,6 +95,8 @@ public class AuthService implements IAuthService { roles.add(ROLE_AUTHENTICATED); roles.add(ROLE_ANONYMOUS); return BeanUtil.copyProperties(userDetail, MyResult.class) + .setRecharge(moneyAccount == null ? BigDecimal.ZERO : moneyAccount.getRecharge()) + .setRevenue(moneyAccount == null ? BigDecimal.ZERO : moneyAccount.getRevenue()) .setCurrentCustomerId(currentCustomerId) .setIdentities(identityInfoList) .setMenus(menuResources) diff --git a/njzscloud-svr/src/main/java/com/njzscloud/dispose/wechat/service/WechatService.java b/njzscloud-svr/src/main/java/com/njzscloud/dispose/wechat/service/WechatService.java index ff83cae..6de6b07 100644 --- a/njzscloud-svr/src/main/java/com/njzscloud/dispose/wechat/service/WechatService.java +++ b/njzscloud-svr/src/main/java/com/njzscloud/dispose/wechat/service/WechatService.java @@ -18,7 +18,6 @@ import com.njzscloud.dispose.wechat.pojo.param.WechatParam; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.List; @@ -65,8 +64,25 @@ public class WechatService { // 使用code向微信服务器换取session_key和openid String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + param.getCode() + "&grant_type=authorization_code"; - RestTemplate restTemplate = new RestTemplate(); - String response = restTemplate.getForObject(url, String.class); + + // 使用 Hutool 发送 GET 请求 + log.info("开始请求微信接口: {}", url); + long startTime = System.currentTimeMillis(); + String response; + try { + HttpResponse httpResponse = HttpRequest.get(url) + .timeout(30000) + .execute(); + response = httpResponse.body(); + long connectTime = System.currentTimeMillis() - startTime; + log.info("微信接口连接耗时: {}ms", connectTime); + httpResponse.close(); + } catch (Exception e) { + log.error("调用微信获取openId接口网络异常: ", e); + throw Exceptions.clierr("网络请求失败"); + } + long totalTime = System.currentTimeMillis() - startTime; + log.info("微信接口总耗时: {}ms", totalTime); JSONObject jsonObject = JSONObject.parseObject(response); if (null == jsonObject) { throw Exceptions.clierr("获取小程序信息失败"); @@ -123,19 +139,25 @@ public class WechatService { // 4. 使用 Hutool 发送 POST 请求(解决 412 错误) String requestBody = String.format("{\"code\":\"%s\"}", code); log.info("发送请求到微信接口,请求体: {}", requestBody); + log.info("开始请求手机号授权接口: {}", url); String response; + long startTime = System.currentTimeMillis(); try { HttpResponse httpResponse = HttpRequest.post(url) .body(requestBody) .timeout(30000) .execute(); response = httpResponse.body(); + long connectTime = System.currentTimeMillis() - startTime; + log.info("手机号授权接口连接耗时: {}ms", connectTime); httpResponse.close(); } catch (Exception e) { log.error("调用微信授权手机号接口网络异常: ", e); throw Exceptions.clierr("网络请求失败"); } + long totalTime = System.currentTimeMillis() - startTime; + log.info("手机号授权接口总耗时: {}ms", totalTime); JSONObject jsonObject = JSONObject.parseObject(response); log.info("微信接口返回原始数据: {}", response); @@ -178,8 +200,25 @@ public class WechatService { String secret = "ff280a71a4c06fc2956178f8c472ef96"; String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret; - RestTemplate restTemplate = new RestTemplate(); - String response = restTemplate.getForObject(tokenUrl, String.class); + // 使用 Hutool 发送 GET 请求 + log.info("开始请求accessToken接口: {}", tokenUrl); + long startTime = System.currentTimeMillis(); + String response; + try { + HttpResponse httpResponse = HttpRequest.get(tokenUrl) + .timeout(30000) + .execute(); + response = httpResponse.body(); + long connectTime = System.currentTimeMillis() - startTime; + log.info("accessToken接口连接耗时: {}ms", connectTime); + httpResponse.close(); + } catch (Exception e) { + log.error("调用微信获取accessToken接口网络异常: ", e); + throw Exceptions.clierr("网络请求失败"); + } + long totalTime = System.currentTimeMillis() - startTime; + log.info("accessToken接口总耗时: {}ms", totalTime); + JSONObject jsonResponse = JSONObject.parseObject(response); if (jsonResponse == null || jsonResponse.containsKey("errcode")) { diff --git a/njzscloud-svr/src/main/resources/mapper/cst/order/OrderEvaluateMapper.xml b/njzscloud-svr/src/main/resources/mapper/cst/order/OrderEvaluateMapper.xml new file mode 100644 index 0000000..a6289e9 --- /dev/null +++ b/njzscloud-svr/src/main/resources/mapper/cst/order/OrderEvaluateMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + id, + order_id, + sn, + user_id, + customer_id, + trans_org_id, + trans_customer_id, + efficiency_score, + fee_score, + attitude_score, + overall_score, + picture, + memo, + creator_id, + modifier_id, + create_time, + modify_time, + deleted + + diff --git a/njzscloud-svr/src/main/resources/mapper/goods/GoodsMapper.xml b/njzscloud-svr/src/main/resources/mapper/goods/GoodsMapper.xml index 1ff7dfb..d66a078 100644 --- a/njzscloud-svr/src/main/resources/mapper/goods/GoodsMapper.xml +++ b/njzscloud-svr/src/main/resources/mapper/goods/GoodsMapper.xml @@ -19,9 +19,6 @@ - - - @@ -47,14 +44,10 @@ c.expense_strategy, c.unit c_unit, c.tax_rate, - c.payer, c.unit_price, c.initial_price, c.initial_quantity, c.every_quantity, - c.user_scope, - c.station_scope, - c.goods_scope, c.canuse c_canuse, c.memo c_memo, c.create_time c_create_time