【admin&from】 新增 1、师傅上传服务图片 2、修复师傅默认头像不显示bug 3、新增只获取服务区域内的师傅

dev
renfan 2025-01-25 16:44:00 +08:00
parent 4eeae215cd
commit 4a0ccb6877
32 changed files with 1319 additions and 301 deletions

View File

@ -69,43 +69,43 @@ public class DistributorCrontab {
} }
} }
@Transactional // @Transactional
public void checkDistributorWithdraw(){ // public void checkDistributorWithdraw(){
List<WithdrawCommission> distributorWithdraws = distributorWithdrawMapper.selectList(new LambdaQueryWrapper<WithdrawCommission>() // List<WithdrawCommission> distributorWithdraws = distributorWithdrawMapper.selectList(new LambdaQueryWrapper<WithdrawCommission>()
.eq(WithdrawCommission::getStatus, DistributorWithdrawStatusEnum.WITHDRAW.getStatus())); // .eq(WithdrawCommission::getStatus, DistributorWithdrawStatusEnum.WITHDRAW.getStatus()));
if(distributorWithdraws.isEmpty()){ // if(distributorWithdraws.isEmpty()){
return; // return;
} // }
log.info("处理佣金提现结果"); // log.info("处理佣金提现结果");
MerchantTransferService merchantTransferService = WxPayServiceUtils.wxPayService(PayChannelEnum.MP_CHANNEL.getCode()).getMerchantTransferService(); // MerchantTransferService merchantTransferService = WxPayServiceUtils.wxPayService(PayChannelEnum.MP_CHANNEL.getCode()).getMerchantTransferService();
for (WithdrawCommission item : distributorWithdraws) { // for (WithdrawCommission item : distributorWithdraws) {
MerchantDetailsQueryRequest merchantDetailsQueryRequest = new MerchantDetailsQueryRequest(); // MerchantDetailsQueryRequest merchantDetailsQueryRequest = new MerchantDetailsQueryRequest();
merchantDetailsQueryRequest.setOutBatchNo(item.getSn()); // merchantDetailsQueryRequest.setOutBatchNo(item.getSn());
merchantDetailsQueryRequest.setOutDetailNo(item.getDetailSn()); // merchantDetailsQueryRequest.setOutDetailNo(item.getDetailSn());
try { // try {
DetailsQueryResult detailsQueryResult = merchantTransferService.queryMerchantDetails(merchantDetailsQueryRequest); // DetailsQueryResult detailsQueryResult = merchantTransferService.queryMerchantDetails(merchantDetailsQueryRequest);
if(DistributorWithdrawResultEnum.FAIL.getStatus().equals(detailsQueryResult.getDetailStatus())){ // if(DistributorWithdrawResultEnum.FAIL.getStatus().equals(detailsQueryResult.getDetailStatus())){
//判断当前提现记录是分销商还师傅的 // //判断当前提现记录是分销商还师傅的
if(item.getDistributorId() != null){ // if(item.getDistributorId() != null){
Distributor distributor = distributorMapper.queryDistributorById(item.getDistributorId()); // Distributor distributor = distributorMapper.queryDistributorById(item.getDistributorId());
distributor.setCanWithdrawCommission(distributor.getCanWithdrawCommission().add(item.getWithdrawMoney())); // distributor.setCanWithdrawCommission(distributor.getCanWithdrawCommission().add(item.getWithdrawMoney()));
distributorMapper.updateById(distributor); // distributorMapper.updateById(distributor);
}else{ // }else{
Staff staff = staffMapper.findStaffById(item.getStaffId()); // Staff staff = staffMapper.findStaffById(item.getStaffId());
staff.setCanWithdrawCommission(staff.getCanWithdrawCommission().add(item.getWithdrawMoney())); // staff.setCanWithdrawCommission(staff.getCanWithdrawCommission().add(item.getWithdrawMoney()));
staffMapper.updateById(staff); // staffMapper.updateById(staff);
} // }
item.setStatus(DistributorWithdrawStatusEnum.WITHDRAW_FAIL.getStatus()); // item.setStatus(DistributorWithdrawStatusEnum.WITHDRAW_FAIL.getStatus());
item.setFailReason(detailsQueryResult.getFailReason()); // item.setFailReason(detailsQueryResult.getFailReason());
distributorWithdrawMapper.updateById(item); // distributorWithdrawMapper.updateById(item);
}else{ // }else{
item.setUpdateTime(TimeUtil.parseStrToDate(detailsQueryResult.getUpdateTime())); // item.setUpdateTime(TimeUtil.parseStrToDate(detailsQueryResult.getUpdateTime()));
item.setStatus(DistributorWithdrawStatusEnum.WITHDRAW_SUCCESS.getStatus()); // item.setStatus(DistributorWithdrawStatusEnum.WITHDRAW_SUCCESS.getStatus());
distributorWithdrawMapper.updateById(item); // distributorWithdrawMapper.updateById(item);
} // }
}catch (WxPayException e){ // }catch (WxPayException e){
log.info(e.getErrCodeDes()); // log.info(e.getErrCodeDes());
} // }
} // }
} // }
} }

View File

@ -87,29 +87,29 @@ public class StaffCrontab {
/** /**
* *
*/ */
@Transactional // @Transactional
public void unfreezingCommission(){ // public void unfreezingCommission(){
log.info("解冻师傅佣金"); // log.info("解冻师傅佣金");
//获取所有待解冻的佣金 // //获取所有待解冻的佣金
QueryWrapper<StaffCommission> staffCommissionQueryWrapper = new QueryWrapper<>(); // QueryWrapper<StaffCommission> staffCommissionQueryWrapper = new QueryWrapper<>();
staffCommissionQueryWrapper.eq("is_delete", GlobalConstant.NOT_DELETE); // staffCommissionQueryWrapper.eq("is_delete", GlobalConstant.NOT_DELETE);
staffCommissionQueryWrapper.eq("status", StaffCommissionStatusEnum.FREEZE.getCode()); // staffCommissionQueryWrapper.eq("status", StaffCommissionStatusEnum.FREEZE.getCode());
List<StaffCommission> staffCommissions = staffCommissionMapper.selectList(staffCommissionQueryWrapper); // List<StaffCommission> staffCommissions = staffCommissionMapper.selectList(staffCommissionQueryWrapper);
//
for (StaffCommission item : staffCommissions) { // for (StaffCommission item : staffCommissions) {
QueryWrapper<Staff> staffQueryWrapper = new QueryWrapper<>(); // QueryWrapper<Staff> staffQueryWrapper = new QueryWrapper<>();
staffQueryWrapper.eq("id",item.getStaffId()); // staffQueryWrapper.eq("id",item.getStaffId());
Staff staff = staffMapper.selectOne(staffQueryWrapper); // Staff staff = staffMapper.selectOne(staffQueryWrapper);
if(staff != null){ // if(staff != null){
//解冻佣金相加 // //解冻佣金相加
staff.setCanWithdrawCommission(staff.getCanWithdrawCommission().add(item.getCommission())); // staff.setCanWithdrawCommission(staff.getCanWithdrawCommission().add(item.getCommission()));
staffMapper.updateById(staff); // staffMapper.updateById(staff);
//修改解冻状态为已解冻 // //修改解冻状态为已解冻
item.setStatus(DistributorCommissionStatusEnum.MAY_WITHDRAW.getCode()); // item.setStatus(DistributorCommissionStatusEnum.MAY_WITHDRAW.getCode());
staffCommissionMapper.updateById(item); // staffCommissionMapper.updateById(item);
} // }
} // }
} // }
} }

View File

@ -335,6 +335,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
vo.setPayTime(TimeUtil.timestampToDate(model.getPayTime())); vo.setPayTime(TimeUtil.timestampToDate(model.getPayTime()));
vo.setFinishTime(TimeUtil.timestampToDate(model.getFinishTime())); vo.setFinishTime(TimeUtil.timestampToDate(model.getFinishTime()));
vo.setCancelTime(TimeUtil.timestampToDate(model.getCancelTime())); vo.setCancelTime(TimeUtil.timestampToDate(model.getCancelTime()));
if(model.getServeImg() != null){
vo.setServiceImages(Arrays.asList(model.getServeImg().split(","))); //将数组转成列表返回给前端
}
// 用户昵称 // 用户昵称
UserVo userVo = userService.detail(model.getUserId().intValue()); UserVo userVo = userService.detail(model.getUserId().intValue());
vo.setNickname(userVo.getNickname()); vo.setNickname(userVo.getNickname());
@ -356,6 +359,17 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
} }
} }
// 师傅信息
if(model.getStaffId() != null){
Staff staff = staffMapper.findStaffById(model.getStaffId());
if(staff != null){
vo.setStaffId(staff.getId());
vo.setStaffName(staff.getName());
vo.setStaffImage(staff.getHeadPortrait());
vo.setStaffSn(staff.getSn());
}
}
//展示历史指派记录 //展示历史指派记录
List<StaffReassignment> staffReassignments = staffReassignmentMapper.selectList(new LambdaQueryWrapper<StaffReassignment>() List<StaffReassignment> staffReassignments = staffReassignmentMapper.selectList(new LambdaQueryWrapper<StaffReassignment>()
.eq(StaffReassignment::getOrderId, orderId) .eq(StaffReassignment::getOrderId, orderId)
@ -384,6 +398,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
vo.setDistributorContact(userVo.getDistContact()); vo.setDistributorContact(userVo.getDistContact());
vo.setDistributorGroup(userVo.getDistGroup()); vo.setDistributorGroup(userVo.getDistGroup());
//退款信息
OrderRefund orderRefund = orderRefundMapper.findOrderRefundByOrderId(orderId);
if(orderRefund != null){
OrderRefundDetailVo orderRefundDetailVo = new OrderRefundDetailVo();//退款记录
orderRefundDetailVo.setRefundReason(orderRefund.getRefundReason()); //退款原因
vo.setOrderRefundDetailVo(orderRefundDetailVo);
}
return vo; return vo;
} }
@ -639,7 +660,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
new QueryWrapper<Staff>() new QueryWrapper<Staff>()
.eq("id", staffId) .eq("id", staffId)
.last("limit 1")); .last("limit 1"));
if(staff != null && staff.getIsOperational() == StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode()) { if(staff != null ) {
if(staff.getIsReceiveOrder() == StaffStatusEnum.ORDER_NOT_AVAILABLE.getCode()){ if(staff.getIsReceiveOrder() == StaffStatusEnum.ORDER_NOT_AVAILABLE.getCode()){
throw new OperateException("当前师傅处于不可接单状态"); throw new OperateException("当前师傅处于不可接单状态");
}else if(staff.getIsOrder() == StaffStatusEnum.REST.getCode()){ }else if(staff.getIsOrder() == StaffStatusEnum.REST.getCode()){
@ -688,14 +709,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
deductScore = new BigDecimal("0"); deductScore = new BigDecimal("0");
timeBefore = Math.toIntExact(TimeUtil.nowTimeDifferenceMinute(model.getAppointTimeStart())); timeBefore = Math.toIntExact(TimeUtil.nowTimeDifferenceMinute(model.getAppointTimeStart()));
} }
//要被指派的师傅不是运营师傅就扣分
if (staff != null && staff.getIsOperational() == StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode()) {
Staff beforeStaff = staffMapper.findStaffById(model.getStaffId());
//扣除申请改派师傅的分数
beforeStaff.setAddScore(BigDecimal.valueOf(beforeStaff.getAddScore()).subtract(deductScore).doubleValue());
staffMapper.updateById(beforeStaff);
}
//修改指派记录 //修改指派记录
StaffReassignment staffReassignment = staffReassignmentMapper.selectOne(new LambdaQueryWrapper<StaffReassignment>() StaffReassignment staffReassignment = staffReassignmentMapper.selectOne(new LambdaQueryWrapper<StaffReassignment>()
.eq(StaffReassignment::getIsDelete,GlobalConstant.NOT_DELETE) .eq(StaffReassignment::getIsDelete,GlobalConstant.NOT_DELETE)
@ -889,7 +902,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
if ("SUCCESS".equals(tradeState)) { if ("SUCCESS".equals(tradeState)) {
// 修改订单的支付信息 // 修改订单的支付信息
model.setPayTime(TimeUtil.dateToTimestamp(TimeUtil.getStringByRFC3339(queryOrderV3.getSuccessTime()))); model.setPayTime(TimeUtil.dateToTimestamp(TimeUtil.getStringByRFC3339(queryOrderV3.getSuccessTime())));
model.setOrderStatus(OrderStatusEnum.RESERVE.getStatus()); model.setOrderStatus(OrderStatusEnum.SERVICING.getStatus());
model.setPayStatus(OrderPayStatusEnum.PAY.getStatus()); model.setPayStatus(OrderPayStatusEnum.PAY.getStatus());
model.setPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType()); model.setPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType());
model.setTransactionId(queryOrderV3.getTransactionId()); model.setTransactionId(queryOrderV3.getTransactionId());
@ -969,7 +982,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
throw new OperateException("只有预约中的服务,师傅才可以确认服务"); throw new OperateException("只有预约中的服务,师傅才可以确认服务");
} }
Staff staff = staffMapper.findStaffById(orderParam.getStaffId()); Staff staff = staffMapper.findStaffById(model.getStaffId());
if (staff == null) { if (staff == null) {
throw new OperateException("师傅不存在"); throw new OperateException("师傅不存在");
} }

View File

@ -211,7 +211,7 @@ public class StaffApplyForServiceImpl implements IStaffApplyForService {
BeanUtils.copyProperties(model,staff); BeanUtils.copyProperties(model,staff);
//实名认证 //实名认证
staff.setId(null); staff.setId(null);
staff.setIsAuthentication(StaffStatusEnum.AUTHENTICATION.getCode()); // staff.setIsAuthentication(StaffStatusEnum.AUTHENTICATION.getCode());
staff.setCreateTime(TimeUtil.nowDate()); staff.setCreateTime(TimeUtil.nowDate());
staff.setSn(staffService.generateNum()); staff.setSn(staffService.generateNum());
staffMapper.insert(staff); staffMapper.insert(staff);

View File

@ -128,7 +128,7 @@ public class StaffPhysicalExaminationServiceImpl implements IStaffPhysicalExamin
.eq("is_delete", GlobalConstant.NOT_DELETE) .eq("is_delete", GlobalConstant.NOT_DELETE)
.eq("id", model.getStaffId())); .eq("id", model.getStaffId()));
//实名认证 //实名认证
staff.setPhysicalExamination(model.getPhysicalExamination()); // staff.setPhysicalExamination(model.getPhysicalExamination());
staff.setUpdateTime(TimeUtil.nowDate()); staff.setUpdateTime(TimeUtil.nowDate());
staffMapper.updateById(staff); staffMapper.updateById(staff);
}else{ }else{
@ -160,7 +160,7 @@ public class StaffPhysicalExaminationServiceImpl implements IStaffPhysicalExamin
} }
} }
staff.setPhysicalExamination(physicalExamination.toString()); // staff.setPhysicalExamination(physicalExamination.toString());
staffMapper.updateById(staff); staffMapper.updateById(staff);
} }
} }

View File

@ -21,10 +21,12 @@ import com.hcy.common.dto.result.StaffResultDto;
import com.hcy.common.dto.staff.StaffDto; import com.hcy.common.dto.staff.StaffDto;
import com.hcy.common.entity.category.GoodsCategory; import com.hcy.common.entity.category.GoodsCategory;
import com.hcy.common.entity.comment.GoodsComment; import com.hcy.common.entity.comment.GoodsComment;
import com.hcy.common.entity.goods.Goods;
import com.hcy.common.entity.staff.Staff; import com.hcy.common.entity.staff.Staff;
import com.hcy.common.entity.staff.StaffApplyFor; import com.hcy.common.entity.staff.StaffApplyFor;
import com.hcy.common.entity.staff.StaffCommission; import com.hcy.common.entity.staff.StaffCommission;
import com.hcy.common.entity.staff.StaffPhysicalExamination; import com.hcy.common.entity.staff.StaffPhysicalExamination;
import com.hcy.common.entity.user.User;
import com.hcy.common.enums.RecommendEnum; import com.hcy.common.enums.RecommendEnum;
import com.hcy.common.enums.StatusEnum; import com.hcy.common.enums.StatusEnum;
import com.hcy.common.enums.staff.StaffApplyForStatusEnum; import com.hcy.common.enums.staff.StaffApplyForStatusEnum;
@ -37,10 +39,8 @@ import com.hcy.common.mapper.staff.StaffApplyForMapper;
import com.hcy.common.mapper.staff.StaffCommissionMapper; import com.hcy.common.mapper.staff.StaffCommissionMapper;
import com.hcy.common.mapper.staff.StaffMapper; import com.hcy.common.mapper.staff.StaffMapper;
import com.hcy.common.mapper.staff.StaffPhysicalExaminationMapper; import com.hcy.common.mapper.staff.StaffPhysicalExaminationMapper;
import com.hcy.common.utils.RegularExpressionUtil; import com.hcy.common.mapper.user.UserMapper;
import com.hcy.common.utils.StringUtil; import com.hcy.common.utils.*;
import com.hcy.common.utils.TimeUtil;
import com.hcy.common.utils.UrlUtil;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -88,6 +88,9 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
@Resource @Resource
GoodsCategoryMapper goodsCategoryMapper; GoodsCategoryMapper goodsCategoryMapper;
@Resource
private UserMapper userMapper;
/** /**
* *
* *
@ -99,6 +102,15 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
Page<StaffListVo> page = new Page<>(params.getPageNo(), params.getPageSize()); Page<StaffListVo> page = new Page<>(params.getPageNo(), params.getPageSize());
StaffDto pageDto = new StaffDto(); StaffDto pageDto = new StaffDto();
BeanUtils.copyProperties(params, pageDto); BeanUtils.copyProperties(params, pageDto);
//服务id不为空时 查询对应服务分类师傅
if(params.getGoodsId() != null){
Goods goods = goodsService.getById(params.getGoodsId());
if(goods != null){
pageDto.setGoodsCategoryId(goods.getCategoryId());
}
}
if(pageDto.getAppointTimeStart() != null && pageDto.getAppointTimeEnd() != null){ if(pageDto.getAppointTimeStart() != null && pageDto.getAppointTimeEnd() != null){
long time = 60 * 60; long time = 60 * 60;
//指派师傅时查询服务时间前后一个小时是否有交叉的订单 //指派师傅时查询服务时间前后一个小时是否有交叉的订单
@ -116,15 +128,17 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
for (StaffResultDto item : resultDtoPage.getRecords()) { for (StaffResultDto item : resultDtoPage.getRecords()) {
StaffListVo vo = new StaffListVo(); StaffListVo vo = new StaffListVo();
BeanUtils.copyProperties(item, vo); BeanUtils.copyProperties(item, vo);
vo.setStatusName(statusMap.get(vo.getStatus()));
vo.setIsRecommendName(recommendMap.get(vo.getIsRecommend())); vo.setIsRecommendName(recommendMap.get(vo.getIsRecommend()));
vo.setProvince(regionMap.get(vo.getProvinceId())); vo.setProvince(regionMap.get(vo.getProvinceId()));
vo.setCity(regionMap.get(vo.getCityId())); vo.setCity(regionMap.get(vo.getCityId()));
vo.setDistrict(regionMap.get(vo.getDistrictId())); vo.setDistrict(regionMap.get(vo.getDistrictId()));
vo.setAvatarUrl(UrlUtil.toAbsoluteUrl(item.getAvatarUri())); vo.setAvatarUrl(UrlUtil.toAbsoluteUrl(item.getAvatarUri()));
vo.setPhysicalExamination(item.getPhysicalExamination()); // if (!item.getAvatarUri().equals("") && !item.getAvatarUri().equals("/api/static/default_avatar.png")) {
//获取待结算金额 // vo.setAvatarUrl(UrlUtil.toAbsoluteUrl(item.getAvatarUri()));
vo.setToBeSettledMoney(getToBeSettledMoney(item.getId())); // } else {
// String avatar = ConfigUtil.get("user", "defaultAvatar", "/api/static/default_avatar.png");
// vo.setAvatarUrl(UrlUtil.toAbsoluteUrl(avatar));
// }
list.add(vo); list.add(vo);
} }
return PageResult.iPageHandle(resultDtoPage.getTotal(), resultDtoPage.getCurrent(), resultDtoPage.getSize(), list); return PageResult.iPageHandle(resultDtoPage.getTotal(), resultDtoPage.getCurrent(), resultDtoPage.getSize(), list);
@ -187,43 +201,24 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
public void add(StaffParam staffParam) { public void add(StaffParam staffParam) {
Assert.notNull(staffParam.getUserId(),"请选择绑定的用户"); Assert.notNull(staffParam.getUserId(),"请选择绑定的用户");
//校验数据完整性 if(!RegularExpressionUtil.checkPhone(staffParam.getMobile())){
if(!RegularExpressionUtil.checkIdCard(staffParam.getIdCard())){
throw new OperateException("身份证格式错误");
}else if(!RegularExpressionUtil.checkPhone(staffParam.getMobile())){
throw new OperateException("无效手机号码"); throw new OperateException("无效手机号码");
} }
User user = userMapper.selectOne(
new QueryWrapper<User>()
.eq("id", staffParam.getUserId())
.eq("is_delete", 0)
.last("limit 1"));
Assert.notNull(user, "当前用户不存在!");
//新增师傅 //新增师傅
Staff staff = new Staff(); Staff staff = new Staff();
BeanUtils.copyProperties(staffParam,staff); BeanUtils.copyProperties(staffParam,staff);
staff.setHeadPortrait(staffParam.getFiles().getAvatar().get(0)); staff.setHeadPortrait(UrlUtil.toAbsoluteUrl(user.getAvatar()));
staff.setIdCardImg(staffParam.getFiles().getPortrait().get(0) + "," + staffParam.getFiles().getBackend().get(0));
StringBuilder physicalExamination = new StringBuilder();
if(!staffParam.getFiles().getPdf().isEmpty()){
physicalExamination.append(staffParam.getFiles().getPdf().get(0));
}
if(staffParam.getFiles().getReport() != null){
for (String img : staffParam.getFiles().getReport()) {
if(StringUtil.isNotEmpty(physicalExamination.toString())){
physicalExamination.append(",").append(img);
}else{
physicalExamination.append(img);
}
}
}
staff.setIsAuthentication(StaffStatusEnum.AUTHENTICATION.getCode());
staff.setCreateTime(TimeUtil.nowDate()); staff.setCreateTime(TimeUtil.nowDate());
staff.setSn(generateNum()); staff.setSn(generateNum());
staff.setPhysicalExamination(physicalExamination.toString());
staff.setCreateTime(TimeUtil.nowDate()); staff.setCreateTime(TimeUtil.nowDate());
staff.setStatus(StaffApplyForStatusEnum.IN_THE_APPLICATION.getCode());
if(staff.getIsOperational() != null){
staff.setIsOperational(staffParam.getIsOperational());
staff.setWorkStartTime(staffParam.getWorkStartTime());
staff.setWorkEndTime(staffParam.getWorkEndTime());
}
staffMapper.insert(staff); staffMapper.insert(staff);
} }
@ -279,9 +274,6 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
model.setIsRecommend(staffParam.getIsRecommend()); model.setIsRecommend(staffParam.getIsRecommend());
model.setUpdateTime(TimeUtil.nowDate()); model.setUpdateTime(TimeUtil.nowDate());
model.setIsReceiveOrder(staffParam.getIsReceiveOrder()); model.setIsReceiveOrder(staffParam.getIsReceiveOrder());
model.setIsOperational(staffParam.getIsOperational());
model.setWorkStartTime(staffParam.getWorkStartTime());
model.setWorkEndTime(staffParam.getWorkEndTime());
staffMapper.updateById(model); staffMapper.updateById(model);
} }
@ -299,19 +291,9 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
.last("limit 1")); .last("limit 1"));
Assert.notNull(model, "师傅不存在!"); Assert.notNull(model, "师傅不存在!");
BigDecimal zero = new BigDecimal("0");
Boolean result = orderService.existOrderByStaffId(model.getId()); Boolean result = orderService.existOrderByStaffId(model.getId());
if (result) { if (result) {
throw new OperateException("该师傅还有未完成的订单,不能删除!"); throw new OperateException("该师傅还有未完成的订单,不能删除!");
}else if(model.getCanWithdrawCommission().compareTo(zero) > 0){
throw new OperateException("该师傅可提现佣金大于0不能删除");
}
BigDecimal sum = staffCommissionMapper.sum("commission", new QueryWrapper<StaffCommission>()
.eq("is_delete", GlobalConstant.NOT_DELETE)
.eq("staff_id", model.getId())
.eq("status", StaffCommissionStatusEnum.FREEZE.getCode()));
if(sum.compareTo(zero) > 0){
throw new OperateException("该师傅待结算佣金大于0不能删除");
} }
model.setIsDelete(GlobalConstant.DELETE); model.setIsDelete(GlobalConstant.DELETE);
model.setDeleteTime(TimeUtil.nowDate()); model.setDeleteTime(TimeUtil.nowDate());
@ -442,15 +424,15 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
public void updateStaffOperationalStatus(StaffParam staffParam) { public void updateStaffOperationalStatus(StaffParam staffParam) {
Staff staff = super.getById(staffParam.getId()); Staff staff = super.getById(staffParam.getId());
Assert.notNull(staff, "师傅不存在!"); Assert.notNull(staff, "师傅不存在!");
//
if(staff.getIsOperational() == StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode() && // if(staff.getIsOperational() == StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode() &&
(StringUtil.isEmpty(staff.getWorkStartTime()) || StringUtil.isEmpty(staff.getWorkEndTime()))){ // (StringUtil.isEmpty(staff.getWorkStartTime()) || StringUtil.isEmpty(staff.getWorkEndTime()))){
throw new OperateException("请先设置该运营师傅的工作时间"); // throw new OperateException("请先设置该运营师傅的工作时间");
} // }
//
staff.setIsOperational(staff.getIsOperational() == StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode() ? // staff.setIsOperational(staff.getIsOperational() == StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode() ?
StaffStatusEnum.OPERATIONAL_STAFF.getCode() : // StaffStatusEnum.OPERATIONAL_STAFF.getCode() :
StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode()); // StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode());
super.updateById(staff); super.updateById(staff);
} }

View File

@ -410,7 +410,13 @@ public class UserServiceImpl implements IUserService {
UserVo userVo = new UserVo(); UserVo userVo = new UserVo();
BeanUtils.copyProperties(item,userVo); BeanUtils.copyProperties(item,userVo);
userVo.setCreateTime(TimeUtil.timestampToDate(item.getCreateTime())); userVo.setCreateTime(TimeUtil.timestampToDate(item.getCreateTime()));
userVo.setAvatar(UrlUtil.toAbsoluteUrl(item.getAvatar())); // userVo.setAvatar(UrlUtil.toAbsoluteUrl(item.getAvatar()));
if (!item.getAvatar().equals("") && !item.getAvatar().equals("/api/static/default_avatar.png")) {
userVo.setAvatar(UrlUtil.toAbsoluteUrl(item.getAvatar()));
} else {
String avatar = ConfigUtil.get("user", "defaultAvatar", "/api/static/default_avatar.png");
userVo.setAvatar(UrlUtil.toAbsoluteUrl(avatar));
}
userVoList.add(userVo); userVoList.add(userVo);
} }

View File

@ -125,4 +125,6 @@ public class StaffParam implements Serializable {
private StaffUploadFile files; private StaffUploadFile files;
private String code; //验证码 private String code; //验证码
private String avatarUri;// 用户头像
} }

View File

@ -172,4 +172,7 @@ public class OrderDetailVo implements Serializable {
private String distributorContact; private String distributorContact;
@ApiModelProperty(value = "分销员组别") @ApiModelProperty(value = "分销员组别")
private String distributorGroup; private String distributorGroup;
private List<String> serviceImages; //服务图片
} }

View File

@ -83,4 +83,6 @@ public class StaffListVo implements Serializable {
private Integer isOperational; //是否运营师傅0-不是 1-是 private Integer isOperational; //是否运营师傅0-不是 1-是
private String workStartTime; //工作开始时间 private String workStartTime; //工作开始时间
private String workEndTime; //工作结束时间 private String workEndTime; //工作结束时间
private int uploadServiceImgBtn; //上传服务图片按钮:0-隐藏;1-显示
} }

View File

@ -35,4 +35,8 @@ public class StaffPageParam extends PageParam {
private Integer isReceiveOrder; //是否可以接单0-可以1-不可接单; private Integer isReceiveOrder; //是否可以接单0-可以1-不可接单;
private Integer isOrder; //师傅是否接单0-接单中1-休息中; private Integer isOrder; //师傅是否接单0-接单中1-休息中;
private Long goodsId; //服务id
private Long staffId; //师傅id
} }

View File

@ -1,7 +1,7 @@
# 项目配置 # 项目配置
like: like:
# upload-directory: /data/file/uploads/ # 文件上传目录 upload-directory: /data/file/uploads/ # 文件上传目录
upload-directory: E:\img\ # upload-directory: E:\img\
# 服务配置 # 服务配置
server: server:
@ -24,16 +24,16 @@ spring:
static-path-pattern: /api/static/** static-path-pattern: /api/static/**
# 数据源配置 # 数据源配置
datasource: datasource:
url: jdbc:mysql://192.168.111.98:3306/homemaking_no_staff?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false # url: jdbc:mysql://192.168.111.98:3306/homemaking_no_staff?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
type: com.zaxxer.hikari.HikariDataSource # 数据源类型
driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
username: root # 数据库账号
password: 1234
# url: jdbc:mysql://123.207.77.26:3306/homemaking?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
# type: com.zaxxer.hikari.HikariDataSource # 数据源类型 # type: com.zaxxer.hikari.HikariDataSource # 数据源类型
# driver-class-name: com.mysql.jdbc.Driver # MySql的驱动 # driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
# username: Homemaking # 数据库账号 # username: root # 数据库账号
# password: kpHaxTyz4ehkYDpS # password: 1234
url: jdbc:mysql://123.207.77.26:3306/homemaking?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
type: com.zaxxer.hikari.HikariDataSource # 数据源类型
driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
username: Homemaking # 数据库账号
password: kpHaxTyz4ehkYDpS
hikari: hikari:
connection-timeout: 30000 # 等待连接分配连接的最大时长(毫秒),超出时长还没可用连接则发送SQLException,默认30秒 connection-timeout: 30000 # 等待连接分配连接的最大时长(毫秒),超出时长还没可用连接则发送SQLException,默认30秒
@ -74,5 +74,5 @@ mybatis-plus:
table-prefix: la_ # 设置表前缀 table-prefix: la_ # 设置表前缀
configuration-properties: configuration-properties:
prefix: la_ # 自定义表前缀标签${prefix} prefix: la_ # 自定义表前缀标签${prefix}
# configuration: #打印sql日志 configuration: #打印sql日志
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

View File

@ -0,0 +1,37 @@
package com.hcy.common.config.wx;
import com.github.binarywang.wxpay.v3.auth.Verifier;
import me.chanjar.weixin.common.error.WxRuntimeException;
import java.security.*;
import java.security.cert.X509Certificate;
import java.util.Base64;
public class CustomPublicKeyVerifier implements Verifier {
private PublicKey publicKey;
private String publicKeyId;
public CustomPublicKeyVerifier(PublicKey publicKey,String publicKeyId) {
this.publicKey = publicKey;
this.publicKeyId = publicKeyId;
}
@Override
public boolean verify(String serialNumber, byte[] message, String signature) {
try {
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initVerify(publicKey);
sign.update(message);
return sign.verify(Base64.getDecoder().decode(signature));
} catch (NoSuchAlgorithmException e) {
throw new WxRuntimeException("当前Java环境不支持SHA256withRSA", e);
} catch (SignatureException e) {
throw new WxRuntimeException("签名验证过程发生了错误", e);
} catch (InvalidKeyException e) {
throw new WxRuntimeException("无效的证书", e);
}
}
@Override
public X509Certificate getValidCertificate() {
return new CustomX509Certificate(publicKey,publicKeyId);
}
}

View File

@ -0,0 +1,147 @@
package com.hcy.common.config.wx;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.*;
import java.util.Date;
import java.util.Set;
public class CustomX509Certificate extends X509Certificate {
private PublicKey publicKey;
private String publicKeyId;
public CustomX509Certificate(PublicKey publicKey, String publicKeyId) {
super();
this.publicKey = publicKey;
this.publicKeyId = publicKeyId;
}
@Override
public byte[] getEncoded() throws CertificateEncodingException {
return new byte[0];
}
@Override
public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException {
}
@Override
public void verify(PublicKey key, String sigProvider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException {
}
@Override
public String toString() {
return null;
}
public PublicKey getPublicKey() {
return this.publicKey;
}
@Override
public void checkValidity() throws CertificateExpiredException, CertificateNotYetValidException {
}
@Override
public void checkValidity(Date date) throws CertificateExpiredException, CertificateNotYetValidException {
}
@Override
public int getVersion() {
return 0;
}
@Override
public BigInteger getSerialNumber() {
return new BigInteger(publicKeyId.replace("PUB_KEY_ID_", ""), 16);
}
@Override
public Principal getIssuerDN() {
return null;
}
@Override
public Principal getSubjectDN() {
return null;
}
@Override
public Date getNotBefore() {
return null;
}
@Override
public Date getNotAfter() {
return null;
}
@Override
public byte[] getTBSCertificate() throws CertificateEncodingException {
return new byte[0];
}
@Override
public byte[] getSignature() {
return new byte[0];
}
@Override
public String getSigAlgName() {
return null;
}
@Override
public String getSigAlgOID() {
return null;
}
@Override
public byte[] getSigAlgParams() {
return new byte[0];
}
@Override
public boolean[] getIssuerUniqueID() {
return new boolean[0];
}
@Override
public boolean[] getSubjectUniqueID() {
return new boolean[0];
}
@Override
public boolean[] getKeyUsage() {
return new boolean[0];
}
@Override
public int getBasicConstraints() {
return 0;
}
@Override
public boolean hasUnsupportedCriticalExtension() {
return false;
}
@Override
public Set<String> getCriticalExtensionOIDs() {
return null;
}
@Override
public Set<String> getNonCriticalExtensionOIDs() {
return null;
}
@Override
public byte[] getExtensionValue(String oid) {
return new byte[0];
}
}

View File

@ -0,0 +1,262 @@
package com.hcy.common.config.wx;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
/**
* PEM
*/
public class PemUtil {
private static final int DEFAULT_BUFFER_SIZE = 8192;
private PemUtil() {
}
/**
* RSA
*
* @param keyString
* @return RSA
*/
public static PrivateKey loadPrivateKeyFromString(String keyString) {
try {
keyString =
keyString
.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s+", "");
return KeyFactory.getInstance("RSA")
.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(keyString)));
} catch (NoSuchAlgorithmException e) {
throw new UnsupportedOperationException(e);
} catch (InvalidKeySpecException e) {
throw new IllegalArgumentException(e);
}
}
/**
*
*
* @param keyString
* @param algorithm
* @param provider the provider
* @return
*/
public static PrivateKey loadPrivateKeyFromString(
String keyString, String algorithm, String provider) {
try {
keyString =
keyString
.replace("-----BEGIN PRIVATE KEY-----", "")
.replace("-----END PRIVATE KEY-----", "")
.replaceAll("\\s+", "");
return KeyFactory.getInstance(algorithm, provider)
.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(keyString)));
} catch (NoSuchAlgorithmException e) {
throw new UnsupportedOperationException(e);
} catch (InvalidKeySpecException | NoSuchProviderException e) {
throw new IllegalArgumentException(e);
}
}
/**
* RSA
*
* @param keyString
* @return RSA
*/
public static PublicKey loadPublicKeyFromString(String keyString) {
try {
keyString =
keyString
.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.replaceAll("\\s+", "");
return KeyFactory.getInstance("RSA")
.generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(keyString)));
} catch (NoSuchAlgorithmException e) {
throw new UnsupportedOperationException(e);
} catch (InvalidKeySpecException e) {
throw new IllegalArgumentException(e);
}
}
/**
* RSA
*
* @param keyPath
* @return RSA
*/
public static PrivateKey loadPrivateKeyFromPath(String keyPath) {
return loadPrivateKeyFromString(readKeyStringFromPath(keyPath));
}
/**
*
*
* @param keyPath
* @param algorithm
* @param provider the provider
* @return
*/
public static PrivateKey loadPrivateKeyFromPath(
String keyPath, String algorithm, String provider) {
return loadPrivateKeyFromString(readKeyStringFromPath(keyPath), algorithm, provider);
}
/**
* RSA
*
* @param keyPath
* @return RSA
*/
public static PublicKey loadPublicKeyFromPath(String keyPath) {
return loadPublicKeyFromString(keyPath);
}
private static String readKeyStringFromPath(String keyPath) {
try (FileInputStream inputStream = new FileInputStream(keyPath)) {
return ioToString(inputStream);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
/**
* X.509
*
* @param inputStream
* @return X.509
*/
public static X509Certificate loadX509FromStream(InputStream inputStream) {
try {
return (X509Certificate)
CertificateFactory.getInstance("X.509").generateCertificate(inputStream);
} catch (CertificateException e) {
throw new IllegalArgumentException(e);
}
}
/**
* X.509
*
* @param inputStream
* @param provider the provider
* @return X.509
*/
public static X509Certificate loadX509FromStream(InputStream inputStream, String provider) {
try {
return (X509Certificate)
CertificateFactory.getInstance("X.509", provider).generateCertificate(inputStream);
} catch (CertificateException | NoSuchProviderException e) {
throw new IllegalArgumentException(e);
}
}
/**
* X.509
*
* @param certificatePath
* @return X.509
*/
public static X509Certificate loadX509FromPath(String certificatePath) {
try (FileInputStream inputStream = new FileInputStream(certificatePath)) {
return loadX509FromStream(inputStream);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
/**
* X.509
*
* @param certificatePath
* @param provider the provider
* @return X.509
*/
public static X509Certificate loadX509FromPath(String certificatePath, String provider) {
try (FileInputStream inputStream = new FileInputStream(certificatePath)) {
return loadX509FromStream(inputStream, provider);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
/**
* X.509
*
* @param certificateString
* @return X.509
*/
public static X509Certificate loadX509FromString(String certificateString) {
try (ByteArrayInputStream inputStream =
new ByteArrayInputStream(certificateString.getBytes(StandardCharsets.UTF_8))) {
return loadX509FromStream(inputStream);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
/**
* X.509
*
* @param certificateString
* @param provider the provider
* @return X.509
*/
public static X509Certificate loadX509FromString(String certificateString, String provider) {
try (ByteArrayInputStream inputStream =
new ByteArrayInputStream(certificateString.getBytes(StandardCharsets.UTF_8))) {
return loadX509FromStream(inputStream, provider);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
public static String getSerialNumber(X509Certificate certificate) {
return certificate.getSerialNumber().toString(16).toUpperCase();
}
/**
*
*
* @param inputStream
* @return
* @throws IOException
*/
public static byte[] toByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[DEFAULT_BUFFER_SIZE];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
return buffer.toByteArray();
}
/**
*
*
* @param inputStream
* @return UTF-8
* @throws IOException
*/
public static String ioToString(InputStream inputStream) throws IOException {
return new String(toByteArray(inputStream), StandardCharsets.UTF_8);
}
}

View File

@ -0,0 +1,385 @@
package com.hcy.common.config.wx;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.config.WxPayHttpProxy;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.util.HttpProxyUtils;
import com.github.binarywang.wxpay.util.ResourcesUtils;
import com.github.binarywang.wxpay.v3.WxPayV3HttpClientBuilder;
import com.github.binarywang.wxpay.v3.auth.*;
import com.github.binarywang.wxpay.v3.util.PemUtils;
import lombok.Data;
import lombok.SneakyThrows;
import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.ssl.SSLContexts;
import javax.net.ssl.SSLContext;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.X509Certificate;
import java.util.Base64;
@Data
public class WxPayCustomConfig extends WxPayConfig {
private static final String DEFAULT_PAY_BASE_URL = "https://api.mch.weixin.qq.com";
private static final String PROBLEM_MSG = "证书文件【%s】有问题请核实";
private static final String NOT_FOUND_MSG = "证书文件【%s】不存在请核实";
private String publicKey;
private String publicKeyId;
/**
* .
*/
private String payBaseUrl = DEFAULT_PAY_BASE_URL;
/**
* http.
*/
private int httpConnectionTimeout = 5000;
/**
* http.
*/
private int httpTimeout = 10000;
/**
* appid.
*/
private String appId;
/**
* ID.
*/
private String subAppId;
/**
* .
*/
private String mchId;
/**
* .
*/
private String mchKey;
/**
* .
*/
private String entPayKey;
/**
* .
*/
private String subMchId;
/**
* url访url.
*/
private String notifyUrl;
/**
* .
* <pre>
* JSAPI--
* NATIVE--
* APP--app
* </pre>
*/
private String tradeType;
/**
* .
* HMAC_SHA256 MD5
*
* @see com.github.binarywang.wxpay.constant.WxPayConstants.SignType
*/
private String signType;
private SSLContext sslContext;
/**
* p12base64
*/
private String keyString;
/**
* p12classpath:.
*/
private String keyPath;
/**
* apiclient_key.pembase64
*/
private String privateKeyString;
/**
* apiclient_key.pemclasspath:.
*/
private String privateKeyPath;
/**
* apiclient_cert.pembase64
*/
private String privateCertString;
/**
* apiclient_cert.pemclasspath:.
*/
private String privateCertPath;
/**
* apiclient_key.pem.
*/
private byte[] privateKeyContent;
/**
* apiclient_cert.pem.
*/
private byte[] privateCertContent;
/**
* apiV3 .
*/
private String apiV3Key;
/**
* apiV3
*/
private String certSerialNo;
/**
* serviceId
*/
private String serviceId;
/**
*
*/
private String payScoreNotifyUrl;
/**
*
*/
private String payScorePermissionNotifyUrl;
private CloseableHttpClient apiV3HttpClient;
/**
*
*/
private PrivateKey privateKey;
/**
* ()
*/
private int certAutoUpdateTime = 60;
/**
* p12.
*/
private byte[] keyContent;
/**
* 使仿.
* 使
*/
private boolean useSandboxEnv = false;
/**
* threadLocal.
*
*/
private boolean ifSaveApiData = false;
private String httpProxyHost;
private Integer httpProxyPort;
private String httpProxyUsername;
private String httpProxyPassword;
/**
* v3X509Certificate
* <a href="https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/min-gan-xin-xi-jia-mi"></a>
*/
private Verifier verifier;
/**
* .
*
* @return
*/
public String getPayBaseUrl() {
if (StringUtils.isEmpty(this.payBaseUrl)) {
return DEFAULT_PAY_BASE_URL;
}
return this.payBaseUrl;
}
@SneakyThrows
public Verifier getVerifier() {
if (verifier == null) {
//当改对象为null时初始化api v3的请求头
initApiV3HttpClient();
}
return verifier;
}
/**
* ssl.
*
* @return the ssl context
* @throws WxPayException the wx pay exception
*/
public SSLContext initSSLContext() throws WxPayException {
if (StringUtils.isBlank(this.getMchId())) {
throw new WxPayException("请确保商户号mchId已设置");
}
try (InputStream inputStream = this.loadConfigInputStream(this.keyString, this.getKeyPath(),
this.keyContent, "p12证书");) {
KeyStore keystore = KeyStore.getInstance("PKCS12");
char[] partnerId2charArray = this.getMchId().toCharArray();
keystore.load(inputStream, partnerId2charArray);
this.sslContext = SSLContexts.custom().loadKeyMaterial(keystore, partnerId2charArray).build();
return this.sslContext;
} catch (Exception e) {
throw new WxPayException("证书文件有问题,请核实!", e);
}
}
/**
* api v3
* https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient
*
* @return org.apache.http.impl.client.CloseableHttpClient
* @author doger.wang
**/
public CloseableHttpClient initApiV3HttpClient() throws WxPayException {
if (StringUtils.isBlank(this.getApiV3Key())) {
throw new WxPayException("请确保apiV3Key值已设置");
}
InputStream keyInputStream = this.loadConfigInputStream(this.getPrivateKeyString(), this.getPrivateKeyPath(),
this.privateKeyContent, "privateKeyPath");
InputStream certInputStream = this.loadConfigInputStream(this.getPrivateCertString(), this.getPrivateCertPath(),
this.privateCertContent, "privateCertPath");
try {
PrivateKey merchantPrivateKey = PemUtils.loadPrivateKey(keyInputStream);
X509Certificate certificate = PemUtils.loadCertificate(certInputStream);
if (StringUtils.isBlank(this.getCertSerialNo())) {
this.certSerialNo = certificate.getSerialNumber().toString(16).toUpperCase();
}
//构造Http Proxy正向代理
WxPayHttpProxy wxPayHttpProxy = getWxPayHttpProxy();
Verifier certificatesVerifier;
if (StringUtils.isBlank(this.getPublicKeyId()) || StringUtils.isBlank(getPublicKey())) {
certificatesVerifier = new AutoUpdateCertificatesVerifier(
new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)),
this.getApiV3Key().getBytes(StandardCharsets.UTF_8), this.getCertAutoUpdateTime(), wxPayHttpProxy);
} else {
PublicKey publicKey = PemUtil.loadPublicKeyFromPath(getPublicKey());
certificatesVerifier = new CustomPublicKeyVerifier(publicKey, getPublicKeyId());
}
WxPayV3HttpClientBuilder wxPayV3HttpClientBuilder = WxPayV3HttpClientBuilder.create()
.withMerchant(mchId, certSerialNo, merchantPrivateKey)
.withValidator(new WxPayValidator(certificatesVerifier));
//初始化V3接口正向代理设置
HttpProxyUtils.initHttpProxy(wxPayV3HttpClientBuilder, wxPayHttpProxy);
CloseableHttpClient httpClient = wxPayV3HttpClientBuilder.build();
this.apiV3HttpClient = httpClient;
this.verifier = certificatesVerifier;
this.privateKey = merchantPrivateKey;
return httpClient;
} catch (Exception e) {
throw new WxPayException("v3请求构造异常", e);
}
}
/**
* WxPayHttpProxy
*
* @return WxPayHttpProxynull
*/
private WxPayHttpProxy getWxPayHttpProxy() {
if (StringUtils.isNotBlank(this.getHttpProxyHost()) && this.getHttpProxyPort() > 0) {
return new WxPayHttpProxy(getHttpProxyHost(), getHttpProxyPort(), getHttpProxyUsername(), getHttpProxyPassword());
}
return null;
}
private InputStream loadConfigInputStream(String configString, String configPath, byte[] configContent,
String fileName) throws WxPayException {
InputStream inputStream;
if (configContent != null) {
inputStream = new ByteArrayInputStream(configContent);
} else if (StringUtils.isNotEmpty(configString)) {
configContent = Base64.getDecoder().decode(configString);
inputStream = new ByteArrayInputStream(configContent);
} else {
if (StringUtils.isBlank(configPath)) {
throw new WxPayException("请确保证书文件地址【" + fileName + "】或者内容已配置");
}
inputStream = this.loadConfigInputStream(configPath);
}
return inputStream;
}
/**
* classpathurl
*
* @param configPath
* @return .
* @throws WxPayException .
*/
private InputStream loadConfigInputStream(String configPath) throws WxPayException {
String fileHasProblemMsg = String.format(PROBLEM_MSG, configPath);
String fileNotFoundMsg = String.format(NOT_FOUND_MSG, configPath);
final String prefix = "classpath:";
InputStream inputStream;
if (configPath.startsWith(prefix)) {
String path = RegExUtils.removeFirst(configPath, prefix);
if (!path.startsWith("/")) {
path = "/" + path;
}
try {
inputStream = ResourcesUtils.getResourceAsStream(path);
if (inputStream == null) {
throw new WxPayException(fileNotFoundMsg);
}
return inputStream;
} catch (Exception e) {
throw new WxPayException(fileNotFoundMsg, e);
}
}
if (configPath.startsWith("http://") || configPath.startsWith("https://")) {
try {
inputStream = new URL(configPath).openStream();
if (inputStream == null) {
throw new WxPayException(fileNotFoundMsg);
}
return inputStream;
} catch (IOException e) {
throw new WxPayException(fileNotFoundMsg, e);
}
} else {
try {
File file = new File(configPath);
if (!file.exists()) {
throw new WxPayException(fileNotFoundMsg);
}
return Files.newInputStream(file.toPath());
} catch (IOException e) {
throw new WxPayException(fileHasProblemMsg, e);
}
}
}
}

View File

@ -33,4 +33,8 @@ public class StaffDto implements Serializable {
private Integer isReceiveOrder; //是否可以接单0-可以1-不可接单 private Integer isReceiveOrder; //是否可以接单0-可以1-不可接单
private Integer isOrder; //师傅是否接单0-接单中1-休息中; private Integer isOrder; //师傅是否接单0-接单中1-休息中;
private Long goodsCategoryId; //服务分类id
private Long staffId; //师傅id
} }

View File

@ -61,4 +61,5 @@ public class Order implements Serializable {
private Long userCouponId; //用户领取优惠券id private Long userCouponId; //用户领取优惠券id
private BigDecimal deductionMoney; //抵扣金额 private BigDecimal deductionMoney; //抵扣金额
private Double addScore; private Double addScore;
private String serveImg; //服务图片
} }

View File

@ -38,19 +38,14 @@ public class Staff implements Serializable {
private Integer isDelete; private Integer isDelete;
private String headPortrait; //头像图片 private String headPortrait; //头像图片
private String idCardImg; //身份证正反面图片 逗号隔开
private String idCard; //身份证号
private Integer age; //年龄 private Integer age; //年龄
private String physicalExamination; //体检报告 多图片逗号隔开
private Double score; //师傅评分 默认评分5 private Double score; //师傅评分 默认评分5
private Double addScore; //追加评分 private Double addScore; //追加评分
private Integer isReceiveOrder; //是否可以接单0-可以1-不可接单 private Integer isReceiveOrder; //是否可以接单0-可以1-不可接单
private Integer isOrder; //师傅是否接单0-接单中1-休息中; private Integer isOrder; //师傅是否接单0-接单中1-休息中;
private Integer isAuthentication; //是否实名认证1-已实名认证0-未实名认证;
private BigDecimal canWithdrawCommission; //可提现佣金
private BigDecimal alreadyWithdraw; //已提现佣金
private Integer isOperational; //是否运营师傅0-不是 1-是
private String workStartTime; //工作开始时间 // private Integer isOperational; //是否运营师傅0-不是 1-是
private String workEndTime; //工作结束时间 // private String workStartTime; //工作开始时间
// private String workEndTime; //工作结束时间
} }

View File

@ -25,6 +25,4 @@ public interface GoodsCategoryMapper extends IBaseMapper<GoodsCategory> {
*/ */
List<GoodsCategory> getCouponCorrelationGoodsCategory(@Param("couponId") long couponId); List<GoodsCategory> getCouponCorrelationGoodsCategory(@Param("couponId") long couponId);
} }

View File

@ -53,49 +53,52 @@
<select id="page" resultType="com.hcy.common.dto.result.OrderPageResultDto"> <select id="page" resultType="com.hcy.common.dto.result.OrderPageResultDto">
select a.id, select a.id,
a.sn, a.sn,
a.user_id as userId, a.user_id as userId,
a.transaction_id as transactionId, a.transaction_id as transactionId,
a.order_type as orderType, a.staff_id as staffId,
a.order_terminal as orderTerminal, a.order_type as orderType,
a.order_status as orderStatus, a.order_terminal as orderTerminal,
a.pay_status as payStatus, a.order_status as orderStatus,
a.pay_way as payWay, a.pay_status as payStatus,
a.goods_price as goodsPrice, a.pay_way as payWay,
a.order_amount as orderAmount, a.goods_price as goodsPrice,
a.total_amount as totalAmount, a.order_amount as orderAmount,
a.total_num as totalNum, a.total_amount as totalAmount,
a.user_remark as userRemark, a.total_num as totalNum,
a.order_remarks as orderRemarks, a.user_remark as userRemark,
a.verification_code as verificationCode, a.order_remarks as orderRemarks,
a.verification_status as verificationStatus, a.verification_code as verificationCode,
a.contact, a.verification_status as verificationStatus,
a.mobile, a.contact,
a.province_id as provinceId, a.mobile,
a.city_id as cityId, a.province_id as provinceId,
a.district_id as districtId, a.city_id as cityId,
a.address, a.district_id as districtId,
a.is_dispatch as isDispatch, a.address,
a.create_time as createTime, a.is_dispatch as isDispatch,
a.update_time as updateTime, a.create_time as createTime,
a.pay_time as payTime, a.update_time as updateTime,
a.delete_time as deleteTime, a.pay_time as payTime,
a.cancel_time as cancelTime, a.delete_time as deleteTime,
a.appoint_time_start as appointTimeStart, a.cancel_time as cancelTime,
a.appoint_time_end as appointTimeEnd, a.appoint_time_start as appointTimeStart,
a.finish_time as finishTime, a.appoint_time_end as appointTimeEnd,
b.sn as userSn, a.finish_time as finishTime,
b.avatar, b.sn as userSn,
b.nickname, b.avatar,
b.username, b.nickname,
c.goods_id as goodsId, b.username,
c.goods_name as goodsName, c.goods_id as goodsId,
c.unit_name as unitName, c.goods_name as goodsName,
d.image as goodsImage c.unit_name as unitName,
d.image as goodsImage,
e.name as staffName
from la_order a from la_order a
left join la_order_goods c on a.id = c.order_id left join la_order_goods c on a.id = c.order_id
left join la_user b on a.user_id = b.id left join la_user b on a.user_id = b.id
left join la_goods d on c.goods_id = d.id left join la_goods d on c.goods_id = d.id
left join la_staff e on a.staff_id = e.id
<where> <where>
a.is_delete = 0 a.is_delete = 0
<if test="form.orderStatus != null and form.orderStatus == 4"> <if test="form.orderStatus != null and form.orderStatus == 4">
@ -118,7 +121,7 @@
</if> </if>
<if test="form.userInfo != null and form.userInfo != ''"> <if test="form.userInfo != null and form.userInfo != ''">
and (b.nickname like concat('%', #{form.userInfo}, '%') or and (b.nickname like concat('%', #{form.userInfo}, '%') or
b.sn like concat('%', #{form.userInfo}, '%')) b.sn like concat('%', #{form.userInfo}, '%'))
</if> </if>
<if test="form.orderTimeStart != null"> <if test="form.orderTimeStart != null">
and a.create_time &gt;= #{form.orderTimeStart} and a.create_time &gt;= #{form.orderTimeStart}
@ -126,6 +129,10 @@
<if test="form.orderTimeEnd != null"> <if test="form.orderTimeEnd != null">
and a.create_time &lt;= #{form.orderTimeEnd} and a.create_time &lt;= #{form.orderTimeEnd}
</if> </if>
<if test="form.staffInfo != null and form.staffInfo != ''">
and e.name like concat('%', #{form.staffInfo}, '%') or
e.sn like concat('%', #{form.staffInfo}, '%')
</if>
</where> </where>
order by a.id desc order by a.id desc
</select> </select>

View File

@ -27,6 +27,9 @@
left join la_user b on a.user_id = b.id left join la_user b on a.user_id = b.id
<where> <where>
a.is_delete = 0 a.is_delete = 0
<if test="form.staffId != null">
and a.id != #{form.staffId}
</if>
<if test="form.status != null"> <if test="form.status != null">
and a.status = #{form.status} and a.status = #{form.status}
</if> </if>
@ -74,6 +77,9 @@
AND ( appoint_time_start &gt; ${form.appointTimeStart} AND appoint_time_end &lt; ${form.appointTimeEnd} )) or a.is_operational = 1) AND ( appoint_time_start &gt; ${form.appointTimeStart} AND appoint_time_end &lt; ${form.appointTimeEnd} )) or a.is_operational = 1)
or a.is_operational = 1) or a.is_operational = 1)
</if> </if>
<if test="form.goodsCategoryId != null">
and FIND_IN_SET(#{form.goodsCategoryId},a.goods_category_ids)
</if>
</where> </where>
order by a.create_time desc order by a.create_time desc
</select> </select>

View File

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.github.binarywang.wxpay.config.WxPayConfig; import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.hcy.common.config.wx.WxPayCustomConfig;
import com.hcy.common.entity.pay.DevPay; import com.hcy.common.entity.pay.DevPay;
import com.hcy.common.entity.system.SystemConfig; import com.hcy.common.entity.system.SystemConfig;
import com.hcy.common.entity.wxpay.SystemWxPayConfig; import com.hcy.common.entity.wxpay.SystemWxPayConfig;
@ -71,7 +72,7 @@ public class WxPayConfiguration {
private WxPayService getWxPayServiceConfig(String chancel){ private WxPayService getWxPayServiceConfig(String chancel){
Boolean flag = Boolean.FALSE; Boolean flag = Boolean.FALSE;
WxPayConfig payConfig = new WxPayConfig(); WxPayCustomConfig payConfig = new WxPayCustomConfig();
DevPay devPay = devPayMapper.getEntityByPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType()); DevPay devPay = devPayMapper.getEntityByPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType());
String config = devPay.getConfig(); String config = devPay.getConfig();
SystemWxPayConfig systemWxPayConfig = JSON.parseObject(config, SystemWxPayConfig.class); SystemWxPayConfig systemWxPayConfig = JSON.parseObject(config, SystemWxPayConfig.class);
@ -86,6 +87,16 @@ public class WxPayConfiguration {
payConfig.setPrivateCertContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientCert()).getBytes()); payConfig.setPrivateCertContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientCert()).getBytes());
flag = Boolean.TRUE; flag = Boolean.TRUE;
} }
payConfig.setPublicKeyId("PUB_KEY_ID_0117052034742025012300326100001464");
payConfig.setPublicKey("-----BEGIN PUBLIC KEY-----\n" +
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7xtJgD6ML1dL3AnCHJ7G\n" +
"lwoSpdZKCb0yoL3D0la47yXgiFcwA+PXum/d5uTBQ3rxXIV1YMPNF7JhA2nPYC9O\n" +
"xTnA+bvAL9e4EP9x3Ocs5Uc9J+p/NxO+FcbD8Qbp6eDM2Rn5iir3TMze0ppMwDCE\n" +
"LtVlSCo5DysLjuL6Ub71QBN0aaOJ5SFQtyRXTizm+sDvL7JvHRbOy+lJsyIN83EW\n" +
"NzWuBMUR5gs7KgCRPSQvAOIXGcfxYP1kYlCbkYHzACDhpKB3ZDQHWIlwVMuCsYb/\n" +
"O4/0gPK/xizNdtjM2SDz/IijWOfVhBb9rup+hccbns4Zi/8hn0+CiiZpBVbWxak2\n" +
"iQIDAQAB\n" +
"-----END PUBLIC KEY-----\n");
// 可以指定是否使用沙箱环境 // 可以指定是否使用沙箱环境
payConfig.setUseSandboxEnv(false); payConfig.setUseSandboxEnv(false);
WxPayService wxPayService = new WxPayServiceImpl(); WxPayService wxPayService = new WxPayServiceImpl();

View File

@ -154,6 +154,18 @@ public class OrderController {
iOrderService.verificationOrder(id, userId); iOrderService.verificationOrder(id, userId);
} }
/**
*
*
* @return Object
*/
@ApiOperation(value = "订单管理 - 师傅核销服务订单")
@GetMapping("/staff/verification")
public void confirmGoods(@Validated @RequestParam("id") Long id, @RequestParam("code") String code) {
Integer userId = FrontThreadLocal.getUserId();
iOrderService.staffConfirmGoods(id, userId, code);
}
/** /**
* *
* *
@ -201,4 +213,11 @@ public class OrderController {
CancelOrderConfigDetailVo cancelOrderConfigByOrder = iOrderService.getCancelOrderConfigByOrder(orderId,goodsId); CancelOrderConfigDetailVo cancelOrderConfigByOrder = iOrderService.getCancelOrderConfigByOrder(orderId,goodsId);
return AjaxResult.success(cancelOrderConfigByOrder == null ? JSON.toJSON(new Object()) : cancelOrderConfigByOrder); return AjaxResult.success(cancelOrderConfigByOrder == null ? JSON.toJSON(new Object()) : cancelOrderConfigByOrder);
} }
@ApiOperation(value = "订单管理 - 师傅上传服务图片")
@PostMapping("/staff/uploadServiceImg")
public void uploadServiceImg(@RequestBody OrderParam orderParam) {;
iOrderService.uploadServiceImg(orderParam);
}
} }

View File

@ -93,4 +93,12 @@ public interface IOrderService {
* @return cancelOrderConfigByOrder * @return cancelOrderConfigByOrder
*/ */
CancelOrderConfigDetailVo getCancelOrderConfigByOrder(Long orderId,Long goodsId); CancelOrderConfigDetailVo getCancelOrderConfigByOrder(Long orderId,Long goodsId);
/**
*
* @param orderParam
*/
void uploadServiceImg(OrderParam orderParam);
void staffConfirmGoods(Long id, Integer userId, String code);
} }

View File

@ -300,6 +300,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
vo.setProvince(regionMap.get(item.getProvinceId())); vo.setProvince(regionMap.get(item.getProvinceId()));
vo.setCity(regionMap.get(item.getCityId())); vo.setCity(regionMap.get(item.getCityId()));
vo.setDistrict(regionMap.get(item.getDistrictId())); vo.setDistrict(regionMap.get(item.getDistrictId()));
if(vo.getOrderStatus() == OrderStatusEnum.FINISHED.getStatus()){
vo.setUploadServiceImgBtn(1); //当订单状态为已完成的时候,显示上传服务图片按钮
}
list.add(vo); list.add(vo);
} }
return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
@ -311,8 +314,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
Integer pageSize = pageParam.getPageSize(); Integer pageSize = pageParam.getPageSize();
Long userId = Long.valueOf(params.get("userId")); Long userId = Long.valueOf(params.get("userId"));
List<String> orderStatusList; List<String> orderStatusList;
if (StringUtils.isNotEmpty(params.get("params"))) { if (StringUtils.isNotEmpty(params.get("orderStatus"))) {
orderStatusList = Arrays.asList(params.get("params").split(",")); orderStatusList = Arrays.asList(params.get("orderStatus").split(","));
} else { } else {
orderStatusList = Arrays.asList(String.valueOf(OrderStatusEnum.SERVICING.getStatus()) orderStatusList = Arrays.asList(String.valueOf(OrderStatusEnum.SERVICING.getStatus())
, String.valueOf(OrderStatusEnum.RESERVE.getStatus()) , String.valueOf(OrderStatusEnum.RESERVE.getStatus())
@ -381,6 +384,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
vo.setWeekDay(TimeUtil.getWeekDay(model.getAppointTimeStart())); vo.setWeekDay(TimeUtil.getWeekDay(model.getAppointTimeStart()));
vo.setPayTime(model.getPayTime() != null ? model.getPayTime().toString() : ""); vo.setPayTime(model.getPayTime() != null ? model.getPayTime().toString() : "");
if(model.getServeImg() != null){
vo.setServiceImages(Arrays.asList(model.getServeImg().split(","))); //将数组转成列表返回给前端
}
if(flag == null || flag == 0){ if(flag == null || flag == 0){
vo.setAppointTime(TimeUtil.timestampToDate(model.getAppointTimeStart(), "yyyy-MM-dd")); vo.setAppointTime(TimeUtil.timestampToDate(model.getAppointTimeStart(), "yyyy-MM-dd"));
}else if(flag == 1){ }else if(flag == 1){
@ -515,9 +522,12 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
} }
} }
// 获取地址
UserAddress userAddress = addressMapper.selectById(orderParam.getAddressId());
Assert.notNull(userAddress, "用户收货地址不能为空");
//校验订单地址是否在服务城市 //校验订单地址是否在服务城市
OpenCity openCity = openCityMapper.selectOne(new LambdaQueryWrapper<OpenCity>() OpenCity openCity = openCityMapper.selectOne(new LambdaQueryWrapper<OpenCity>()
.eq(OpenCity::getCityId, orderParam.getCityId()) .eq(OpenCity::getCityId, userAddress.getCityId())
.eq(OpenCity::getIsDelete, GlobalConstant.NOT_DELETE)); .eq(OpenCity::getIsDelete, GlobalConstant.NOT_DELETE));
if(openCity == null){ if(openCity == null){
throw new OperateException("该订单地址未开通家政服务"); throw new OperateException("该订单地址未开通家政服务");
@ -550,9 +560,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
// 默认未核销 // 默认未核销
model.setVerificationStatus(OrderVerificationStatusEnum.WAIT_VERIFICATION.getStatus()); model.setVerificationStatus(OrderVerificationStatusEnum.WAIT_VERIFICATION.getStatus());
// 获取地址
UserAddress userAddress = addressMapper.selectById(orderParam.getAddressId());
Assert.notNull(userAddress, "用户收货地址不能为空");
model.setContact(userAddress.getContact()); model.setContact(userAddress.getContact());
model.setMobile(userAddress.getMobile()); model.setMobile(userAddress.getMobile());
model.setProvinceId(userAddress.getProvinceId()); model.setProvinceId(userAddress.getProvinceId());
@ -678,17 +686,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
if(model.getOrderAmount().compareTo(new BigDecimal("0")) == 0){ if(model.getOrderAmount().compareTo(new BigDecimal("0")) == 0){
model.setPayStatus(OrderPayStatusEnum.PAY.getStatus());//支付状态;已支付; model.setPayStatus(OrderPayStatusEnum.PAY.getStatus());//支付状态;已支付;
model.setPayTime(TimeUtil.timestamp()); model.setPayTime(TimeUtil.timestamp());
model.setOrderStatus(OrderStatusEnum.SERVICING.getStatus()); //订单状态预约中 model.setOrderStatus(OrderStatusEnum.RESERVE.getStatus()); //订单状态预约中
model.setIsDispatch(OrderDispatchEnum.IS_DISPATCH.getStatus()); //付完款直接已派单
// TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
// @Override
// public void afterCommit() {
// //通知师傅接单
// staffReceiveOrderService.notificationStaff(model.getId());
// }
// });
} }
model.setIsDispatch(OrderDispatchEnum.NOT_DISPATCH.getStatus());
orderMapper.insert(model); orderMapper.insert(model);
//零元购新增记录订单日志 //零元购新增记录订单日志
@ -964,7 +964,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
} }
//不是运营师傅才做限制 //不是运营师傅才做限制
if(staff.getIsOperational() == StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode()){ if(staff.getUserId() != null){
//判断是否存在服务中的订单 //判断是否存在服务中的订单
List<Order> orderList = orderMapper.selectList(new QueryWrapper<Order>() List<Order> orderList = orderMapper.selectList(new QueryWrapper<Order>()
.eq("is_delete", GlobalConstant.NOT_DELETE) .eq("is_delete", GlobalConstant.NOT_DELETE)
@ -984,7 +984,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
throw new OperateException("该预约时间段内,存在时间冲突,不能确认该服务"); throw new OperateException("该预约时间段内,存在时间冲突,不能确认该服务");
} }
if(model.getAppointTimeStart() > TimeUtil.timestamp()){ if(model.getAppointTimeStart() > (TimeUtil.timestamp() + 3600)){
throw new OperateException("未到预约时间,不可开始服务"); throw new OperateException("未到预约时间,不可开始服务");
} }
} }
@ -1061,9 +1061,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
model.setTransactionId(queryOrderV3.getTransactionId()); model.setTransactionId(queryOrderV3.getTransactionId());
model.setUpdateTime(TimeUtil.timestamp()); model.setUpdateTime(TimeUtil.timestamp());
model.setCreateTime(null); model.setCreateTime(null);
model.setOrderStatus(OrderStatusEnum.SERVICING.getStatus()); //下单且支付成功后就变到已预约 model.setOrderStatus(OrderStatusEnum.RESERVE.getStatus()); //下单且支付成功后就变到已预约
model.setVerificationStatus(OrderVerificationStatusEnum.WAIT_VERIFICATION.getStatus()); model.setVerificationStatus(OrderVerificationStatusEnum.WAIT_VERIFICATION.getStatus());
model.setIsDispatch(OrderDispatchEnum.IS_DISPATCH.getStatus()); //付完款直接已派单 //model.setIsDispatch(OrderDispatchEnum.IS_DISPATCH.getStatus()); //付完款直接已派单
orderMapper.updateById(model); orderMapper.updateById(model);
// 记录日志 // 记录日志
orderLogService.saveOrderLog(orderId, model.getUserId(), OrderLogEnum.USER_PAY_ORDER.getDesc()); orderLogService.saveOrderLog(orderId, model.getUserId(), OrderLogEnum.USER_PAY_ORDER.getDesc());
@ -1351,5 +1351,122 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
return cancelOrderConfigDetailVo; return cancelOrderConfigDetailVo;
} }
/**
*
*
* @param orderParam
*/
@Override
public void uploadServiceImg(OrderParam orderParam) {
Order model = orderMapper.selectOne(
new QueryWrapper<Order>()
.eq("id", orderParam.getId())
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
if(model.getOrderStatus() == OrderStatusEnum.SERVICING.getStatus() ||
model.getOrderStatus() == OrderStatusEnum.FINISHED.getStatus()){
BeanUtils.copyProperties(orderParam,model);
model.setServeImg(String.join(",", orderParam.getServiceImages())); //服务图片
orderMapper.updateById(model);
}else{
throw new OperateException("当前订单状态无法上传服务图片");
}
}
@Override
@Transactional
public void staffConfirmGoods(Long id, Integer userId, String code) {
Order model = orderMapper.selectOne(
new QueryWrapper<Order>()
.eq("id", id)
.last("limit 1"));
Assert.notNull(model, "数据不存在!");
if (OrderStatusEnum.SERVICING.getStatus() != model.getOrderStatus()) {
throw new OperateException("只有已预约的订单才能进行核销");
}
String verificationCode = model.getVerificationCode();
if (!verificationCode.equalsIgnoreCase(code)) {
throw new OperateException("核销码错误,请重新输入");
}
model.setVerificationStatus(OrderVerificationStatusEnum.VERIFICATION.getStatus());
model.setOrderStatus(OrderStatusEnum.FINISHED.getStatus());
model.setFinishTime(TimeUtil.timestamp());
model.setUpdateTime(TimeUtil.timestamp());
orderMapper.updateById(model);
//获取服务信息
// OrderGoods orderGoods = orderGoodsService.getByOrderId(model.getId());
// BigDecimal defaultPrice = new BigDecimal("0");
/*//更新用户积分
User user = userMapper.selectOne(
new QueryWrapper<User>()
.eq("id", userId)
.last("limit 1"));
user.setIntegral(user.getIntegral() + orderGoods.getIntegral());
userMapper.updateById(user);*/
//创建分销佣金
// if (model.getDistrictId() != null && model.getDistrictId() != 0) {
// //获取分销商信息
// QueryWrapper<Distributor> distributorQueryWrapper = new QueryWrapper<>();
// distributorQueryWrapper.eq("is_delete", GlobalConstant.NOT_DELETE);
// distributorQueryWrapper.eq("id", model.getDistributorId());
// Distributor distributor = distributorMapper.selectOne(distributorQueryWrapper);
// //组装参数
// DistributorCommission distributorCommission = new DistributorCommission();
// distributorCommission.setOrderId(model.getId());
//
// if (distributor != null) {
// //支付金额不等于零时或者服务金额为零时
// if (model.getOrderAmount().compareTo(defaultPrice) > 0 &&
// orderGoods.getDistributorCommissionRate().compareTo(defaultPrice) > 0 &&
// distributor.getCommissionRate().compareTo(defaultPrice) > 0) {
// //计算佣金
// BigDecimal goodsCommissionRate = orderGoods.getDistributorCommissionRate().divide(new BigDecimal("100"));
// BigDecimal distributorRate = distributor.getCommissionRate().divide(new BigDecimal("10.00"));
// BigDecimal result = orderGoods.getTotalPayPrice().multiply(goodsCommissionRate).multiply(distributorRate).setScale(2, RoundingMode.HALF_UP);
// //如果结算金额小于0.01时 佣金为0
// if (result.compareTo(new BigDecimal("0.01")) < 0) {
// distributorCommission.setCommission(defaultPrice);
// } else {
// distributorCommission.setCommission(result);
// }
// } else {
// distributorCommission.setCommission(defaultPrice);
// }
// distributorCommission.setDistributorId(distributor.getId());
// distributorCommission.setDistributorCommissionRate(orderGoods.getDistributorCommissionRate());
// distributorCommission.setGoodsCommissionRate(orderGoods.getGoodsCommissionRate());
// distributorCommission.setCreateTime(TimeUtil.nowDate());
// distributorCommission.setStatus(DistributorCommissionStatusEnum.FREEZE.getCode());
// distributorCommission.setIsDelete(GlobalConstant.NOT_DELETE);
// distributorCommissionMapper.insert(distributorCommission);
// }
// }
//后台指派师傅 追加评分
// if(model.getAddScore() != null){
// Staff staff = staffService.getById(model.getStaffId());
// staff.setAddScore(staff.getAddScore() + model.getAddScore());
// staffMapper.updateById(staff);
// }
//创建师傅佣金
// StaffCommission staffCommission = new StaffCommission();
// staffCommission.setStaffId(model.getStaffId());
// staffCommission.setOrderId(model.getId());
// staffCommission.setGoodsCommissionRate(orderGoods.getStaffCommissionRate());
//师傅抽成
// if(orderGoods.getStaffCommissionRate().compareTo(defaultPrice) > 0){
// staffCommission.setCommission(model.getOrderAmount().multiply(orderGoods.getStaffCommissionRate()
// .divide(new BigDecimal("100"))));
// }else{
// staffCommission.setCommission(defaultPrice);
// }
// staffCommission.setCreateTime(TimeUtil.nowDate());
// staffCommissionMapper.insert(staffCommission);
orderLogService.saveOrderLog(id, userId.longValue(), OrderLogEnum.USER_VERIFICATION.getDesc());
}
} }

View File

@ -353,43 +353,43 @@ public class StaffReceiveOrderServiceImpl extends ServiceImpl<StaffMapper, Staff
} }
//不是运营师傅要通过条件判断 //不是运营师傅要通过条件判断
if(staff.getIsOperational() == StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode()){ // if(staff.getIsOperational() == StaffStatusEnum.NOT_OPERATIONAL_STAFF.getCode()){
if(staff.getIsReceiveOrder() == StaffStatusEnum.ORDER_NOT_AVAILABLE.getCode()){ // if(staff.getIsReceiveOrder() == StaffStatusEnum.ORDER_NOT_AVAILABLE.getCode()){
throw new OperateException("当前属于不可接单状态,请联系客服"); // throw new OperateException("当前属于不可接单状态,请联系客服");
}else if(staff.getIsOrder() == StaffStatusEnum.REST.getCode()){ // }else if(staff.getIsOrder() == StaffStatusEnum.REST.getCode()){
throw new OperateException("休息中,不可接单"); // throw new OperateException("休息中,不可接单");
} // }
//
String msg = ""; // String msg = "";
//判断师傅当前分数是否可以接单和接单数量是否达到上限 // //判断师傅当前分数是否可以接单和接单数量是否达到上限
List<Order> orderList = orderMapper.selectList(new QueryWrapper<Order>() // List<Order> orderList = orderMapper.selectList(new QueryWrapper<Order>()
.eq("is_delete", GlobalConstant.NOT_DELETE) // .eq("is_delete", GlobalConstant.NOT_DELETE)
.eq("staff_id",staffId) // .eq("staff_id",staffId)
.and(query -> query.ne("order_status", OrderStatusEnum.FINISHED.getStatus()) // .and(query -> query.ne("order_status", OrderStatusEnum.FINISHED.getStatus())
.ne("order_status", OrderStatusEnum.CLOSE.getStatus()))); // .ne("order_status", OrderStatusEnum.CLOSE.getStatus())));
Double score = staff.getScore(); // Double score = staff.getScore();
if(score >= 4.5 && orderList.size() >= 5){ // if(score >= 4.5 && orderList.size() >= 5){
msg = "已达到当前评分接单上限"; // msg = "已达到当前评分接单上限";
}else if(score >= 4 && score < 4.5 && orderList.size() >= 3){ // }else if(score >= 4 && score < 4.5 && orderList.size() >= 3){
msg = "已达到当前评分接单上限"; // msg = "已达到当前评分接单上限";
}else if(score >= 3.5 && score <4 && orderList.size() >= 2){ // }else if(score >= 3.5 && score <4 && orderList.size() >= 2){
msg = "已达到当前评分接单上限"; // msg = "已达到当前评分接单上限";
} // }
if(StringUtil.isNotEmpty(msg)){ // if(StringUtil.isNotEmpty(msg)){
throw new OperateException(msg); // throw new OperateException(msg);
} // }
//
//判断当前接单时间和已接订单是否冲突 // //判断当前接单时间和已接订单是否冲突
for (Order item : orderList) { // for (Order item : orderList) {
long startTime = item.getAppointTimeStart() - 3600; // long startTime = item.getAppointTimeStart() - 3600;
long endTime = item.getAppointTimeEnd() + 3600; // long endTime = item.getAppointTimeEnd() + 3600;
//当前订单预约的开始时间和结束时间不可在已接订单之间且只能接已接订单前后一个小时的订单 // //当前订单预约的开始时间和结束时间不可在已接订单之间且只能接已接订单前后一个小时的订单
if(TimeUtil.isEffectiveDate(model.getAppointTimeStart(),startTime,endTime) || // if(TimeUtil.isEffectiveDate(model.getAppointTimeStart(),startTime,endTime) ||
TimeUtil.isEffectiveDate(model.getAppointTimeEnd(),startTime,endTime)){ // TimeUtil.isEffectiveDate(model.getAppointTimeEnd(),startTime,endTime)){
throw new OperateException("当前订单和已接订单上门时间冲突"); // throw new OperateException("当前订单和已接订单上门时间冲突");
} // }
} // }
} // }
//更改订单状态 //更改订单状态
model.setStaffMobile(staff.getMobile()); model.setStaffMobile(staff.getMobile());

View File

@ -398,7 +398,7 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
//已实名认证成功 //已实名认证成功
if(staff != null){ if(staff != null){
staffCenterVo.setStaffId(staff.getId()); staffCenterVo.setStaffId(staff.getId());
staffCenterVo.setAuthenticationStatus(staff.getIsAuthentication()); // staffCenterVo.setAuthenticationStatus(staff.getIsAuthentication());
staffCenterVo.setIsOrder(staff.getIsOrder()); staffCenterVo.setIsOrder(staff.getIsOrder());
BeanUtils.copyProperties(staff,staffCenterVo); BeanUtils.copyProperties(staff,staffCenterVo);
//体检报告 //体检报告
@ -407,26 +407,26 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
.eq("staff_id", staff.getId()) .eq("staff_id", staff.getId())
.orderByDesc("create_time").last("limit 1")); .orderByDesc("create_time").last("limit 1"));
//已提交体检报告 //已提交体检报告
if(StringUtils.isNotEmpty(staff.getPhysicalExamination())){ // if(StringUtils.isNotEmpty(staff.getPhysicalExamination())){
staffCenterVo.setPhysicalExaminationStatus(1); // staffCenterVo.setPhysicalExaminationStatus(1);
staffCenterVo.setIsReceiveOrder(staff.getIsReceiveOrder()); // staffCenterVo.setIsReceiveOrder(staff.getIsReceiveOrder());
if(staffPhysicalExamination != null){ // if(staffPhysicalExamination != null){
staffCenterVo.setIsReadr(staffPhysicalExamination.getIsRead()); // staffCenterVo.setIsReadr(staffPhysicalExamination.getIsRead());
}else{ // }else{
staffCenterVo.setIsReadr(1); // staffCenterVo.setIsReadr(1);
} // }
}else{ // }else{
if(staffPhysicalExamination != null){ // if(staffPhysicalExamination != null){
if(staffPhysicalExamination.getStatus() == 0){ // if(staffPhysicalExamination.getStatus() == 0){
staffCenterVo.setPhysicalExaminationStatus(2); // staffCenterVo.setPhysicalExaminationStatus(2);
}else if(staffPhysicalExamination.getStatus() == 2){ // }else if(staffPhysicalExamination.getStatus() == 2){
staffCenterVo.setPhysicalExaminationStatus(3); // staffCenterVo.setPhysicalExaminationStatus(3);
staffCenterVo.setRefuseReason(staffPhysicalExamination.getRefuseReason()); // staffCenterVo.setRefuseReason(staffPhysicalExamination.getRefuseReason());
} // }
}else{ // }else{
staffCenterVo.setPhysicalExaminationStatus(0); // staffCenterVo.setPhysicalExaminationStatus(0);
} // }
} // }
staffCenterVo.setAuthenticationStatus(StaffStatusEnum.AUTHENTICATION.getCode()); staffCenterVo.setAuthenticationStatus(StaffStatusEnum.AUTHENTICATION.getCode());
return staffCenterVo; return staffCenterVo;
} }
@ -496,8 +496,8 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
Assert.notNull(staff,"该师傅不存在"); Assert.notNull(staff,"该师傅不存在");
StaffWallet staffWallet = new StaffWallet(); StaffWallet staffWallet = new StaffWallet();
staffWallet.setAlreadyWithdraw(staff.getAlreadyWithdraw()); // staffWallet.setAlreadyWithdraw(staff.getAlreadyWithdraw());
staffWallet.setCanWithdrawCommission(staff.getCanWithdrawCommission()); // staffWallet.setCanWithdrawCommission(staff.getCanWithdrawCommission());
BigDecimal sum = staffCommissionMapper.sum("commission", new QueryWrapper<StaffCommission>() BigDecimal sum = staffCommissionMapper.sum("commission", new QueryWrapper<StaffCommission>()
.eq("is_delete", GlobalConstant.NOT_DELETE) .eq("is_delete", GlobalConstant.NOT_DELETE)
@ -873,12 +873,12 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
Assert.notNull(staff,"师傅不存在"); Assert.notNull(staff,"师傅不存在");
UserAuth userAuth = userAuthMapper.queryUserAuthByUserId(staff.getUserId()); UserAuth userAuth = userAuthMapper.queryUserAuthByUserId(staff.getUserId());
Assert.notNull(userAuth,"师傅未绑定用户或绑定用户不存在"); Assert.notNull(userAuth,"师傅未绑定用户或绑定用户不存在");
//
if(withdrawCommissionParam.getWithdrawMoney().compareTo(new BigDecimal("0.1")) < 0){ // if(withdrawCommissionParam.getWithdrawMoney().compareTo(new BigDecimal("0.1")) < 0){
throw new OperateException("提现金额必须大于0.1元"); // throw new OperateException("提现金额必须大于0.1元");
}else if (staff.getCanWithdrawCommission().compareTo(withdrawCommissionParam.getWithdrawMoney()) < 0){ // }else if (staff.getCanWithdrawCommission().compareTo(withdrawCommissionParam.getWithdrawMoney()) < 0){
throw new OperateException("账户余额不足"); // throw new OperateException("账户余额不足");
} // }
String staffSn = SnUtils.getCommissionWithdrawSn(); String staffSn = SnUtils.getCommissionWithdrawSn();
String staffDetailSn = SnUtils.getCommissionWithdrawSn(); String staffDetailSn = SnUtils.getCommissionWithdrawSn();
@ -924,7 +924,7 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
TransferCreateResult transfer = merchantTransferService.createTransfer(transferCreateRequest); TransferCreateResult transfer = merchantTransferService.createTransfer(transferCreateRequest);
withdrawCommission.setBatchId(transfer.getBatchId()); withdrawCommission.setBatchId(transfer.getBatchId());
withdrawCommission.setStatus(DistributorWithdrawStatusEnum.WITHDRAW.getStatus()); withdrawCommission.setStatus(DistributorWithdrawStatusEnum.WITHDRAW.getStatus());
staff.setCanWithdrawCommission(staff.getCanWithdrawCommission().subtract(withdrawCommissionParam.getWithdrawMoney())); // staff.setCanWithdrawCommission(staff.getCanWithdrawCommission().subtract(withdrawCommissionParam.getWithdrawMoney()));
staffMapper.updateById(staff); staffMapper.updateById(staff);
commissionWithdrawMapper.updateById(withdrawCommission); commissionWithdrawMapper.updateById(withdrawCommission);
@ -970,7 +970,6 @@ public class StaffServiceImpl extends ServiceImpl<StaffMapper, Staff> implements
public List<Staff> queryOperationalStaff() { public List<Staff> queryOperationalStaff() {
return staffMapper.selectList(new LambdaQueryWrapper<Staff>() return staffMapper.selectList(new LambdaQueryWrapper<Staff>()
.eq(Staff::getIsDelete, GlobalConstant.NOT_DELETE) .eq(Staff::getIsDelete, GlobalConstant.NOT_DELETE)
.eq(Staff::getIsOrder,StaffStatusEnum.ORDER_AVAILABLE.getCode()) .eq(Staff::getIsOrder,StaffStatusEnum.ORDER_AVAILABLE.getCode()));
.eq(Staff::getIsOperational, StaffStatusEnum.OPERATIONAL_STAFF.getCode()));
} }
} }

View File

@ -10,6 +10,7 @@ import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List;
/** /**
* *
@ -176,4 +177,7 @@ public class OrderParam implements Serializable {
@ApiModelProperty(value = "是否使用积分抵扣金额:1是 0否") @ApiModelProperty(value = "是否使用积分抵扣金额:1是 0否")
private Long isIntegral; private Long isIntegral;
private List<String> serviceImages; //服务图片
} }

View File

@ -11,6 +11,7 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List;
/** /**
* OrderVo * OrderVo
@ -144,4 +145,7 @@ public class OrderDetailVo implements Serializable {
private BigDecimal projectCost; //项目费用 private BigDecimal projectCost; //项目费用
private OrderRefundDetailVo orderRefundDetailVo; //退款详情 private OrderRefundDetailVo orderRefundDetailVo; //退款详情
private List<String> serviceImages; //服务图片
} }

View File

@ -116,4 +116,6 @@ public class OrderListVo implements Serializable {
private int contactBtn; private int contactBtn;
private BigDecimal projectCost; //项目费用 private BigDecimal projectCost; //项目费用
private int uploadServiceImgBtn; //上传服务图片按钮:0-隐藏;1-显示
} }

View File

@ -1,7 +1,7 @@
# 项目配置 # 项目配置
like: like:
# upload-directory: /data/file/uploads/ # 文件上传目录 upload-directory: /data/file/uploads/ # 文件上传目录
upload-directory: E:\img\ # upload-directory: E:\img\
# 服务配置 # 服务配置
server: server:
port: 8086 port: 8086
@ -20,16 +20,16 @@ spring:
static-path-pattern: /api/static/** static-path-pattern: /api/static/**
# 数据源配置 # 数据源配置
datasource: datasource:
url: jdbc:mysql://192.168.111.98:3306/homemaking_no_staff?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false # url: jdbc:mysql://192.168.111.98:3306/homemaking_no_staff?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
type: com.zaxxer.hikari.HikariDataSource # 数据源类型
driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
username: root # 数据库账号
password: 1234
# url: jdbc:mysql://123.207.77.26:3306/homemaking?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
# type: com.zaxxer.hikari.HikariDataSource # 数据源类型 # type: com.zaxxer.hikari.HikariDataSource # 数据源类型
# driver-class-name: com.mysql.jdbc.Driver # MySql的驱动 # driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
# username: Homemaking # 数据库账号 # username: root # 数据库账号
# password: kpHaxTyz4ehkYDpS # password: 1234
url: jdbc:mysql://123.207.77.26:3306/homemaking?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
type: com.zaxxer.hikari.HikariDataSource # 数据源类型
driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
username: Homemaking # 数据库账号
password: kpHaxTyz4ehkYDpS
hikari: hikari:
connection-timeout: 30000 # 等待连接分配连接的最大时长(毫秒),超出时长还没可用连接则发送SQLException,默认30秒 connection-timeout: 30000 # 等待连接分配连接的最大时长(毫秒),超出时长还没可用连接则发送SQLException,默认30秒
minimum-idle: 5 # 最小连接数 minimum-idle: 5 # 最小连接数