202506051554

This commit is contained in:
张潘 2025-06-05 15:54:59 +08:00
parent cc4234b257
commit 13aebd4218
8 changed files with 786 additions and 341 deletions

View File

@ -4,8 +4,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject; import com.ruoyi.system.controllerUtil.VerificationResult;
import com.ruoyi.system.controllerUtil.orderUtil; import com.ruoyi.system.controllerUtil.OrderUtil;
import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.*;
import com.ruoyi.system.service.*; import com.ruoyi.system.service.*;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@ -116,6 +116,20 @@ public class OrderController extends BaseController {
} }
/**
* 获取服务订单详细信息
*/
@PreAuthorize("@ss.hasPermi('system:Order:query')")
@GetMapping(value = "generateCode")
public AjaxResult generateCode() {
return success(OrderUtil.generateCode());
}
/** /**
* 新增服务订单 * 新增服务订单
*/ */
@ -123,7 +137,7 @@ public class OrderController extends BaseController {
@Log(title = "服务订单", businessType = BusinessType.INSERT) @Log(title = "服务订单", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public AjaxResult add(@RequestBody Order order) { public AjaxResult add(@RequestBody Order order) {
orderUtil orderUtil = new orderUtil(); OrderUtil orderUtil = new OrderUtil();
//1,根据用户手机号和地址判断用户的数据数据和地址数据 //1,根据用户手机号和地址判断用户的数据数据和地址数据
//如果用户数据不存在则添加用户数据 //如果用户数据不存在则添加用户数据
//如果用户地址不存在则添加用户地址数据 //如果用户地址不存在则添加用户地址数据
@ -171,11 +185,6 @@ public class OrderController extends BaseController {
}else{ }else{
return error(); return error();
} }
} }
@ -188,10 +197,25 @@ public class OrderController extends BaseController {
@PutMapping @PutMapping
public AjaxResult edit(@RequestBody Order order) { public AjaxResult edit(@RequestBody Order order) {
//插入订单日志记录 //插入订单日志记录
orderUtil orderUtil = new orderUtil(); OrderUtil orderUtil = new OrderUtil();
Order oldorder=orderService.selectOrderById(order.getId());
//验证订单状态
VerificationResult verificationResult = orderUtil.validateOrderStatusChange(order, oldorder);
if (verificationResult.getCode().equals(VerificationResult.CODE_SUCCESS)){
//特殊情况状态不变的情况下不插入日志记录
if (!verificationResult.getData().equals("NODATA")){
//开始服务需要给order做标记
orderUtil.SaveOrderLog(order); orderUtil.SaveOrderLog(order);
return toAjax(orderService.updateOrder(order) }else{
); if(!order.getStatus().equals(oldorder.getStatus())){
orderUtil.SaveOrderLog(order);
}
}
return toAjax(orderService.updateOrder(order));
}else{
return error(verificationResult.getData());
}
} }
/** /**

View File

@ -0,0 +1,179 @@
package com.ruoyi.system.controllerUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.Order;
/**
* 订单状态验证器
* 专门处理订单状态变更的验证逻辑
*
* @author ruoyi
*/
public class OrderStatusValidator {
// 订单状态常量定义
public static final int STATUS_ZERO = 0; // 派单
public static final int STATUS_DISPATCH = 1; // 派单
public static final int STATUS_ACCEPT = 2; // 接单
public static final int STATUS_SET_FEE = 3; // 设置上门费
public static final int STATUS_DEPART = 4; // 出发上门
public static final int STATUS_ARRIVE = 5; // 到达上门
public static final int STATUS_QUOTE = 6; // 项目报价
public static final int STATUS_START_SERVICE = 7; // 开始服务
public static final int STATUS_PAUSE_SERVICE = 8; // 暂停服务
public static final int STATUS_COMPLETE = 9; // 服务完成
/**
* 验证派单状态
*
* @param newOrder 新订单状态
* @param oldStatus 旧订单状态
* @return 验证结果
*/
public VerificationResult validateDispatchStatus(Order newOrder, Integer oldStatus) {
if (oldStatus != STATUS_ZERO) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "此订单不允许派单");
}
if (newOrder.getOrderLog() == null || newOrder.getOrderLog().getWorkerId() == null) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "派单师傅不能为空");
}
return new VerificationResult(VerificationResult.CODE_SUCCESS, "验证通过");
}
/**
* 验证接单状态
*
* @param oldStatus 旧订单状态
* @return 验证结果
*/
public VerificationResult validateAcceptStatus(Integer oldStatus) {
if (oldStatus != STATUS_DISPATCH) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请先完成派单之后再进行操作");
}
return new VerificationResult(VerificationResult.CODE_SUCCESS, "验证通过");
}
/**
* 验证设置上门费状态
*
* @param newOrder 新订单状态
* @param oldStatus 旧订单状态
* @return 验证结果
*/
public VerificationResult validateSetFeeStatus(Order newOrder, Integer oldStatus) {
if (oldStatus != STATUS_ACCEPT) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请先完成接单之后再进行操作");
}
if (newOrder.getOrderLog() == null || newOrder.getOrderLog().getPrice() == null) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请设置上门费之后再进行操作");
}
return new VerificationResult(VerificationResult.CODE_SUCCESS, "验证通过");
}
/**
* 验证出发上门状态
*
* @param oldStatus 旧订单状态
* @return 验证结果
*/
public VerificationResult validateDepartStatus(Integer oldStatus) {
if (oldStatus != STATUS_SET_FEE) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请先设置上门费后再进行操作");
}
return new VerificationResult(VerificationResult.CODE_SUCCESS, "验证通过");
}
/**
* 验证到达上门状态
*
* @param oldStatus 旧订单状态
* @return 验证结果
*/
public VerificationResult validateArriveStatus(Integer oldStatus) {
if (oldStatus != STATUS_DEPART) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请先完成出发上门后再进行操作");
}
return new VerificationResult(VerificationResult.CODE_SUCCESS, "验证通过");
}
/**
* 验证项目报价状态
*
* @param newOrder 新订单状态
* @param oldStatus 旧订单状态
* @return 验证结果
*/
public VerificationResult validateQuoteStatus(Order newOrder, Integer oldStatus) {
if (oldStatus != STATUS_ARRIVE) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请先完成到达上门后再进行操作");
}
if (isOrderLogContentEmpty(newOrder)) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请填写项目报价");
}
return new VerificationResult(VerificationResult.CODE_SUCCESS, "验证通过");
}
/**
* 验证开始服务状态
* 只允许从项目报价(6)或暂停服务(8)状态转换到开始服务
*
* @param newOrder 新订单状态
* @param oldStatus 旧订单状态
* @return 验证结果
*/
public VerificationResult validateStartServiceStatus(Order newOrder, Integer oldStatus) {
// 只有状态为6(项目报价)或8(暂停服务)时才可以执行开始服务
if (oldStatus != STATUS_QUOTE && oldStatus != STATUS_PAUSE_SERVICE) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "只能从项目报价或暂停服务状态转换到开始服务");
}
if (isOrderLogContentEmpty(newOrder)) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请上传服务图片");
}
return new VerificationResult(VerificationResult.CODE_SUCCESS, "验证通过");
}
/**
* 验证暂停服务状态
*
* @param newOrder 新订单状态
* @param oldStatus 旧订单状态
* @return 验证结果
*/
public VerificationResult validatePauseServiceStatus(Order newOrder, Integer oldStatus) {
if (oldStatus != STATUS_START_SERVICE) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请先开始服务再进行操作");
}
if (isOrderLogContentEmpty(newOrder)) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请填写暂停服务原因,下次服务时间,暂停图片等信息再进行操作");
}
return new VerificationResult(VerificationResult.CODE_SUCCESS, "验证通过");
}
/**
* 验证服务完成状态
*
* @param newOrder 新订单状态
* @param oldStatus 旧订单状态
* @return 验证结果
*/
public VerificationResult validateCompleteStatus(Order newOrder, Integer oldStatus) {
if (oldStatus != STATUS_START_SERVICE) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请先开始服务后再进行操作");
}
if (isOrderLogContentEmpty(newOrder)) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "请上传服务完成图片");
}
return new VerificationResult(VerificationResult.CODE_SUCCESS, "验证通过");
}
/**
* 检查订单日志内容是否为空
*
* @param order 订单对象
* @return true-内容为空false-内容不为空
*/
private boolean isOrderLogContentEmpty(Order order) {
return order.getOrderLog() == null ||
StringUtils.isEmpty(order.getOrderLog().getContent());
}
}

View File

@ -0,0 +1,354 @@
package com.ruoyi.system.controllerUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.AmapUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.Order;
import com.ruoyi.system.domain.OrderLog;
import com.ruoyi.system.domain.UserAddress;
import com.ruoyi.system.domain.Users;
import com.ruoyi.system.service.IOrderLogService;
import com.ruoyi.system.service.IOrderService;
import com.ruoyi.system.service.IUserAddressService;
import com.ruoyi.system.service.IUsersService;
import org.springframework.stereotype.Controller;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
* 服务订单Controller工具类
*/
@Controller
public class OrderUtil {
private static IUsersService usersService = SpringUtils.getBean(IUsersService.class);
private static IOrderLogService orderLogService = SpringUtils.getBean(IOrderLogService.class);
private static IOrderService orderService = SpringUtils.getBean(IOrderService.class);
//新增订单状态
private static final String TITLE_1 = "订单生成";
private static final String TITLE_1_CONTENT_TYPE1 = "管理人员生成订单";
private static final String TITLE_1_CONTENT_TYPE2 = "预约成功,将尽快为主人派单";
//派单订单状态
private static final String TITLE_2 = "平台派单";
private static final String TITLE_2_1 = "系统派单";
private static final String TITLE_2_CONTENT_TYPE2 = "师傅收到派单信息";
//师傅接单
private static final String TITLE_3 = "师傅接单";
private static final String TITLE_3_CONTENT_TYPE3 = "同意系统配单";
//设置上门费
//出发上门
private static final String TITLE_4 = "出发上门";
private static final String TITLE_4_CONTENT_TYPE4 = "师傅收到派单信息准备出发";
//设置上门费
private static final String TITLE_5 = "师傅到达";
private static final String TITLE_5_CONTENT_TYPE5 = "师傅到达服务地点";
//项目报价
private static final String TITLE_6 = "已检查评估报价";
//开始服务
private static final String TITLE_7 = "进行服务";
//开始服务
private static final String TITLE_7_1 = "继续服务";
//暂停服务
private static final String TITLE_8 = "暂停服务";
//服务完成
private static final String TITLE_9 = "服务完成";
//订单取消
private static final String TITLE_10 = "订单取消";
private static final String TITLE_10_CONTENT_TYPE10 = "订单取消";
private static final String PREFIX = "C";
private static final int FIXED_LENGTH = 15; // 总长度为15
/**
* 生成订单编码的工具
*/
public static String generateCode() {
// 获取当前日期格式化为yyyyMMdd
String currentDate = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
// 生成固定长度的随机数字字符串
int randomLength = FIXED_LENGTH - 1 - currentDate.length(); // 计算需要生成的随机数位数
StringBuilder randomBuilder = new StringBuilder();
Random random = new Random();
for (int i = 0; i < randomLength; i++) {
randomBuilder.append(random.nextInt(10)); // 生成0-9之间的随机数字
}
// 拼接最终的编码
return PREFIX + currentDate + randomBuilder.toString();
}
/**
* 验证订单状态变更是否合法
*
* @param newOrder 新订单状态
* @param oldOrder 旧订单状态
* @return 验证结果包含状态码和消息
*/
public VerificationResult validateOrderStatusChange(Order newOrder, Order oldOrder) {
// 基础参数验证
if (oldOrder == null) {
return new VerificationResult(VerificationResult.CODE_FAILURE, "旧订单不能为空");
}
Integer newStatus = newOrder.getJsonStatus();
Integer oldStatus = null;
if (oldOrder.getJsonStatus() != null) {
oldStatus = oldOrder.getJsonStatus();
} else {
oldStatus = 0;
}
// 状态未发生变化直接通过
if (Objects.equals(newStatus, oldStatus)) {
return new VerificationResult(VerificationResult.CODE_SUCCESS, "NODATA");
}
// 创建验证器实例
OrderStatusValidator validator = new OrderStatusValidator();
// 根据新状态进行相应验证
switch (newStatus) {
case OrderStatusValidator.STATUS_DISPATCH:
return validator.validateDispatchStatus(newOrder, oldStatus);
case OrderStatusValidator.STATUS_ACCEPT:
return validator.validateAcceptStatus(oldStatus);
case OrderStatusValidator.STATUS_SET_FEE:
return validator.validateSetFeeStatus(newOrder, oldStatus);
case OrderStatusValidator.STATUS_DEPART:
return validator.validateDepartStatus(oldStatus);
case OrderStatusValidator.STATUS_ARRIVE:
return validator.validateArriveStatus(oldStatus);
case OrderStatusValidator.STATUS_QUOTE:
return validator.validateQuoteStatus(newOrder, oldStatus);
case OrderStatusValidator.STATUS_START_SERVICE:
return validator.validateStartServiceStatus(newOrder, oldStatus);
case OrderStatusValidator.STATUS_PAUSE_SERVICE:
return validator.validatePauseServiceStatus(newOrder, oldStatus);
case OrderStatusValidator.STATUS_COMPLETE:
return validator.validateCompleteStatus(newOrder, oldStatus);
default:
return new VerificationResult(VerificationResult.CODE_FAILURE, "无效的订单状态");
}
}
//1,根据用户手机号判断用户不存在,4如果不存在就要新增一个用户数据
public Map<String, Object> isUser(String phone, String adressName) {
AmapUtils amapUtils = new AmapUtils();
Map<String, Object> map = new HashMap<String, Object>();
if (SpringUtils.getBean(IUsersService.class).selectUsersByPhone(phone) == null) {
//1,用户不存在添加用户
Users users = new Users();
users.setName("微信用户");
users.setType("1");
users.setStatus(1);
users.setPhone(phone);
if (SpringUtils.getBean(IUsersService.class).insertUsers(users) > 0) {
//添加成功用户后添加用户地址
return isAddAdressUser(users, adressName);
} else {
map.put("code", "0");
return map;
}
} else {
return isAddAdressUser(SpringUtils.getBean(IUsersService.class).selectUsersByPhone(phone), adressName);
}
}
//2根据用户地址获取经纬度然后存地址数据
public Map<String, Object> isAddAdressUser(Users users, String adressName) {
Map<String, Object> map = new HashMap<String, Object>();
UserAddress selectuserAddress = new UserAddress();
selectuserAddress.setUid(users.getId());
selectuserAddress.setAddressName(adressName);
List<UserAddress> userAddresslist = SpringUtils.getBean(IUserAddressService.class).selectUserAddressList(selectuserAddress);
//判断用户地址是否存在
if (!userAddresslist.isEmpty()) {
map.put("code", "1");
map.put("users", users);
map.put("UserAddress", userAddresslist.get(0));
return map;
} else {
//如果用户地址不存在就添加地址
AmapUtils amapUtils = new AmapUtils();
JSONObject jsonObject = amapUtils.geocode(adressName);
UserAddress userAddress = new UserAddress();
userAddress.setUid(users.getId());
userAddress.setName(users.getName());
userAddress.setPhone(users.getPhone());
userAddress.setAddressName(adressName);
userAddress.setAddressInfo(adressName);
userAddress.setInfo(adressName);
if (jsonObject.get("info").equals("OK")) {
JSONArray jsonArray = jsonObject.getJSONArray("geocodes");
if (!jsonArray.isEmpty()) {
JSONObject jsonObject1 = (JSONObject) jsonArray.get(0);
String itude = jsonObject1.get("location").toString();
String[] latitude = itude.split(",");
userAddress.setLatitude(latitude[1]);
userAddress.setLongitude(latitude[0]);
}
}
userAddress.setIsDefault(Long.valueOf(1));
if (SpringUtils.getBean(IUserAddressService.class).insertUserAddress(userAddress) > 0) {
map.put("code", "1");
map.put("users", users);
map.put("UserAddress", userAddress);
return map;
} else {
map.put("code", "0");
return map;
}
}
}
//新增订单后添加订单记录
public int SaveOrderLog(Order order) {
JSONObject jsonObject = new JSONObject();
OrderLog orderLog = new OrderLog();
if (Objects.equals(order.getStatus(), 1L)) {
if (order.getCreateType() == 2) {
jsonObject.put("name", TITLE_1_CONTENT_TYPE1);
} else {
jsonObject.put("name", TITLE_1_CONTENT_TYPE2);
}
orderLog.setTitle(TITLE_1);
orderLog.setType(new BigDecimal(1.0));
}
if (Objects.equals(order.getStatus(), 2L)) {
//分配师傅待接单
if (order.getJsonStatus() == 1) {
if (order.getOrderLog() != null) {
if (order.getOrderLog().getWorkerId() != null) {
Users users = usersService.selectUsersById(order.getOrderLog().getWorkerId());
if (users != null) {
orderLog.setWorkerName(users.getName());
}
}
}
orderLog.setTitle(TITLE_2);
jsonObject.put("name", TITLE_2_CONTENT_TYPE2);
orderLog.setType(new BigDecimal(1.1));
}
//师傅同意接单
if (order.getJsonStatus() == 2) {
order.setIsPause(1);
order.setReceiveType(3l);
order.setReceiveTime(new Date());
order.setIsAccept(1);
order.setWorkerId(orderLog.getWorkerId());
orderService.updateOrder(order);
orderLog.setFirstWorkerId(orderLog.getWorkerId());
orderLog.setIsPause(1);
orderLog.setTitle(TITLE_3);
jsonObject.put("name", TITLE_3_CONTENT_TYPE3);
orderLog.setType(new BigDecimal(2.0));
}
//设置上门费
if (order.getJsonStatus() == 3) {
orderLog.setPrice(order.getOrderLog().getPrice());
orderLog.setPaid(1L);
orderLog.setTitle(TITLE_4);
jsonObject.put("name", TITLE_4_CONTENT_TYPE4);
orderLog.setType(new BigDecimal(3.0));
}
//出发上门
if (order.getJsonStatus() == 4) {
orderLog.setTitle(TITLE_4);
jsonObject.put("name", TITLE_4_CONTENT_TYPE4);
orderLog.setType(new BigDecimal(3.0));
}
//确认到达
if (order.getJsonStatus() == 5) {
orderLog.setTitle(TITLE_5);
jsonObject.put("name", TITLE_5_CONTENT_TYPE5);
orderLog.setType(new BigDecimal(4.0));
}
//项目报价
if (order.getJsonStatus() == 6) {
orderLog.setTitle(TITLE_6);
orderLog.setDeposit(order.getOrderLog().getDeposit());
orderLog.setPrice(order.getTotalPrice());
orderLog.setPaid(1L);
if ((order.getOrderLog().getDeposit()).compareTo(BigDecimal.ZERO) > 0) {
orderLog.setDepPaid(1);
}
jsonObject = JSONObject.parseObject(order.getOrderLog().getContent());
orderLog.setType(new BigDecimal(5.0));
}
}
if (Objects.equals(order.getStatus(), 3L)) {
//开始服务
if (order.getJsonStatus() == 7) {
if (order.getIsPause() == 2) {
order.setIsPause(1);
orderService.updateOrder(order);
orderLog.setIsPause(1);
orderLog.setTitle(TITLE_7_1);
jsonObject = JSONObject.parseObject(order.getOrderLog().getContent());
orderLog.setType(new BigDecimal(6.0));
} else {
orderLog.setTitle(TITLE_7);
jsonObject = JSONObject.parseObject(order.getOrderLog().getContent());
orderLog.setType(new BigDecimal(6.0));
}
}
//暂停服务
if (order.getJsonStatus() == 8) {
order.setIsPause(2);
orderService.updateOrder(order);
orderLog.setIsPause(2);
orderLog.setTitle(TITLE_8);
jsonObject = JSONObject.parseObject(order.getOrderLog().getContent());
orderLog.setType(new BigDecimal(7.0));
}
//完成服务
if (order.getJsonStatus() == 9) {
orderLog.setTitle(TITLE_9);
jsonObject = JSONObject.parseObject(order.getOrderLog().getContent());
orderLog.setType(new BigDecimal(8.0));
}
}
//取消订单
if (Objects.equals(order.getStatus(), 5L)) {
order.setIsPause(1);
orderService.updateOrder(order);
orderLog.setIsPause(2);
orderLog.setTitle(TITLE_10);
jsonObject.put("name", TITLE_10_CONTENT_TYPE10);
orderLog.setType(new BigDecimal(9.0));
}
orderLog.setRemark(order.getRemark());
orderLog.setOid(order.getId());
orderLog.setOrderId(order.getOrderId());
orderLog.setContent(jsonObject.toJSONString());
return orderLogService.insertOrderLog(orderLog);
}
}

View File

@ -0,0 +1,24 @@
package com.ruoyi.system.controllerUtil;
public class VerificationResult {
private String code;
private String data;
public VerificationResult(String code, String data) {
this.code = code;
this.data = data;
}
public String getCode() {
return code;
}
public String getData() {
return data;
}
public static final String CODE_NODATA = "2";
public static final String CODE_SUCCESS = "1";
public static final String CODE_FAILURE = "0";
}

View File

@ -1,223 +0,0 @@
package com.ruoyi.system.controllerUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.AmapUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.Order;
import com.ruoyi.system.domain.OrderLog;
import com.ruoyi.system.domain.UserAddress;
import com.ruoyi.system.domain.Users;
import com.ruoyi.system.service.IOrderLogService;
import com.ruoyi.system.service.IUserAddressService;
import com.ruoyi.system.service.IUsersService;
import org.springframework.stereotype.Controller;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* 服务订单Controller工具类
*/
@Controller
public class orderUtil {
private static IUsersService usersService = SpringUtils.getBean(IUsersService.class);
private static IOrderLogService orderLogService = SpringUtils.getBean(IOrderLogService.class);
//新增订单状态
private static final String TITLE_1 = "订单生成";
private static final String TITLE_1_CONTENT_TYPE1 = "管理人员生成订单";
private static final String TITLE_1_CONTENT_TYPE2 = "预约成功,将尽快为主人派单";
//派单订单状态
private static final String TITLE_2 = "平台派单";
private static final String TITLE_2_1 = "系统派单";
private static final String TITLE_2_CONTENT_TYPE2 = "师傅收到派单信息";
//师傅接单
private static final String TITLE_3 = "师傅接单";
private static final String TITLE_3_CONTENT_TYPE3 = "同意系统配单";
//设置上门费
//出发上门
private static final String TITLE_4 = "出发上门";
private static final String TITLE_4_CONTENT_TYPE4 = "师傅收到派单信息准备出发";
//设置上门费
private static final String TITLE_5 = "师傅到达";
private static final String TITLE_5_CONTENT_TYPE5 = "师傅到达服务地点";
//项目报价
private static final String TITLE_6 = "已检查评估报价";
//开始服务
private static final String TITLE_7 = "进行服务";
//暂停服务
private static final String TITLE_8 = "暂停服务";
//暂停服务
private static final String TITLE_9 = "服务完成";
//1,根据用户手机号判断用户不存在,4如果不存在就要新增一个用户数据
public Map<String, Object> isUser(String phone, String adressName) {
AmapUtils amapUtils = new AmapUtils();
Map<String, Object> map = new HashMap<String, Object>();
if (SpringUtils.getBean(IUsersService.class).selectUsersByPhone(phone) == null) {
//1,用户不存在添加用户
Users users = new Users();
users.setName("微信用户");
users.setType("1");
users.setStatus(1);
users.setPhone(phone);
if (SpringUtils.getBean(IUsersService.class).insertUsers(users) > 0) {
//添加成功用户后添加用户地址
return isAddAdressUser(users, adressName);
} else {
map.put("code", "0");
return map;
}
} else {
return isAddAdressUser(SpringUtils.getBean(IUsersService.class).selectUsersByPhone(phone), adressName);
}
}
//2根据用户地址获取经纬度然后存地址数据
public Map<String, Object> isAddAdressUser(Users users, String adressName) {
Map<String, Object> map = new HashMap<String, Object>();
UserAddress selectuserAddress = new UserAddress();
selectuserAddress.setUid(users.getId());
selectuserAddress.setAddressName(adressName);
List<UserAddress> userAddresslist = SpringUtils.getBean(IUserAddressService.class).selectUserAddressList(selectuserAddress);
//判断用户地址是否存在
if (!userAddresslist.isEmpty()) {
map.put("code", "1");
map.put("users", users);
map.put("UserAddress", userAddresslist.get(0));
return map;
} else {
//如果用户地址不存在就添加地址
AmapUtils amapUtils = new AmapUtils();
JSONObject jsonObject = amapUtils.geocode(adressName);
UserAddress userAddress = new UserAddress();
userAddress.setUid(users.getId());
userAddress.setName(users.getName());
userAddress.setPhone(users.getPhone());
userAddress.setAddressName(adressName);
userAddress.setAddressInfo(adressName);
userAddress.setInfo(adressName);
if (jsonObject.get("info").equals("OK")) {
JSONArray jsonArray = jsonObject.getJSONArray("geocodes");
if (!jsonArray.isEmpty()) {
JSONObject jsonObject1 = (JSONObject) jsonArray.get(0);
String itude = jsonObject1.get("location").toString();
String[] latitude = itude.split(",");
userAddress.setLatitude(latitude[1]);
userAddress.setLongitude(latitude[0]);
}
}
userAddress.setIsDefault(Long.valueOf(1));
if (SpringUtils.getBean(IUserAddressService.class).insertUserAddress(userAddress) > 0) {
map.put("code", "1");
map.put("users", users);
map.put("UserAddress", userAddress);
return map;
} else {
map.put("code", "0");
return map;
}
}
}
//新增订单后添加订单记录
public int SaveOrderLog(Order order) {
JSONObject jsonObject=new JSONObject();
OrderLog orderLog = new OrderLog();
if (Objects.equals(order.getStatus(), 1L)){
if (order.getCreateType()==2){
jsonObject.put("name",TITLE_1_CONTENT_TYPE1);
}else{
jsonObject.put("name",TITLE_1_CONTENT_TYPE2);
}
orderLog.setTitle(TITLE_1);
orderLog.setType(new BigDecimal(1.0));
}
if (Objects.equals(order.getStatus(), 2L)){
//分配师傅待接单
if (order.getJsonStatus()==1){
if(order.getOrderLog()!=null){
if (order.getOrderLog().getWorkerId()!=null){
Users users=usersService.selectUsersById(order.getOrderLog().getWorkerId());
if (users!=null){
orderLog.setWorkerName(users.getName());
}
}
}
orderLog.setTitle(TITLE_2);
jsonObject.put("name",TITLE_2_CONTENT_TYPE2);
orderLog.setType(new BigDecimal(1.1));
}
//师傅同意接单
if (order.getJsonStatus()==2){
orderLog.setTitle(TITLE_3);
jsonObject.put("name",TITLE_3_CONTENT_TYPE3);
orderLog.setType(new BigDecimal(2.0));
}
//设置上门费
if (order.getJsonStatus()==3){
orderLog.setPrice(order.getOrderLog().getPrice());
orderLog.setTitle(TITLE_4);
jsonObject.put("name",TITLE_4_CONTENT_TYPE4);
orderLog.setType(new BigDecimal(3.0));
}
//出发上门
if (order.getJsonStatus()==4){
orderLog.setTitle(TITLE_4);
jsonObject.put("name",TITLE_4_CONTENT_TYPE4);
orderLog.setType(new BigDecimal(3.0));
}
//确认到达
if (order.getJsonStatus()==5){
orderLog.setTitle(TITLE_5);
jsonObject.put("name",TITLE_5_CONTENT_TYPE5);
orderLog.setType(new BigDecimal(4.0));
}
//项目报价
if (order.getJsonStatus()==6){
orderLog.setTitle(TITLE_6);
jsonObject=JSONObject.parseObject(order.getOrderLog().getContent());
orderLog.setType(new BigDecimal(5.0));
}
}
if (Objects.equals(order.getStatus(), 3L)){
//开始服务
if(order.getJsonStatus()==7){
orderLog.setTitle(TITLE_7);
jsonObject=JSONObject.parseObject(order.getOrderLog().getContent());
orderLog.setType(new BigDecimal(6.0));
}
//暂停服务
if(order.getJsonStatus()==8){
orderLog.setTitle(TITLE_8);
jsonObject=JSONObject.parseObject(order.getOrderLog().getContent());
orderLog.setType(new BigDecimal(7.0));
}
//完成服务
if(order.getJsonStatus()==9){
orderLog.setTitle(TITLE_9);
jsonObject=JSONObject.parseObject(order.getOrderLog().getContent());
orderLog.setType(new BigDecimal(8.0));
}
}
orderLog.setRemark(order.getRemark());
orderLog.setOid(order.getId());
orderLog.setOrderId(order.getOrderId());
orderLog.setContent(jsonObject.toJSONString());
return orderLogService.insertOrderLog(orderLog);
}
}

View File

@ -73,6 +73,16 @@ export function getCallRecords(orderId) {
}) })
} }
// 获取通话记录列表
export function generateCode() {
return request({
url: '/system/Order/generateCode/',
method: 'get'
})
}
// 获取通话记录列表 // 获取通话记录列表
export function getCommentRecords(orderId) { export function getCommentRecords(orderId) {
return request({ return request({

View File

@ -42,6 +42,7 @@
<!-- 项目费用结构 --> <!-- 项目费用结构 -->
<div v-if="item.project"> <div v-if="item.project">
<div>项目费用: {{ item.project.price }}</div> <div>项目费用: {{ item.project.price }}</div>
<div v-if="item.basic && item.basic.length">基础项: {{ item.basic.map(b => b.name).join('、') }}</div> <div v-if="item.basic && item.basic.length">基础项: {{ item.basic.map(b => b.name).join('、') }}</div>
<div v-if="item.craft && item.craft.length">所需服务: {{ item.craft.map(c => `${c.name}${c.price}*${c.count}`).join('、') }}</div> <div v-if="item.craft && item.craft.length">所需服务: {{ item.craft.map(c => `${c.name}${c.price}*${c.count}`).join('、') }}</div>
<div v-if="item.material && item.material.length">所需物料: {{ item.material.map(m => `${m.name}${m.price}*${m.count}`).join('、') }}</div> <div v-if="item.material && item.material.length">所需物料: {{ item.material.map(m => `${m.name}${m.price}*${m.count}`).join('、') }}</div>
@ -49,6 +50,8 @@
<!-- 普通文本或名称/评价 --> <!-- 普通文本或名称/评价 -->
<div v-else> <div v-else>
<div v-if="item.name || item.text">{{ item.name || item.text }}</div> <div v-if="item.name || item.text">{{ item.name || item.text }}</div>
<div v-if="item.pauseReason || item.text">暂停原因:{{ item.pauseReason || item.text }}</div>
<div v-if="item.nextServiceTime || item.text">下次服务时间:{{ item.nextServiceTime || item.text }}</div>
<!-- 图片列表 --> <!-- 图片列表 -->
<div v-if="item.image && (item.image.length || (typeof item.image === 'string' && item.image))" class="image-list" style="margin:8px 0;"> <div v-if="item.image && (item.image.length || (typeof item.image === 'string' && item.image))" class="image-list" style="margin:8px 0;">
<el-image <el-image

View File

@ -472,26 +472,8 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="备注" prop="orderLog.remark">
<el-input
v-model="form.orderLog.remark"
type="textarea"
placeholder="请输入备注"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="预约时间" prop="appointmentDate">
<el-date-picker
v-model="form.appointmentDate"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
style="width: 100%"
/>
</el-form-item>
</el-col>
</template> </template>
<!-- 派单内容 --> <!-- 派单内容 -->
@ -508,14 +490,10 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="备注" prop="orderLog.remark">
<el-input v-model="form.orderLog.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-col>
</template> </template>
<!-- 接单内容 --> <!-- 接单内容
<template v-if="form.jsonStatus === 2"> <template v-if="form.jsonStatus === 2">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注" prop="orderLog.remark"> <el-form-item label="备注" prop="orderLog.remark">
@ -526,35 +504,15 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</template> </template>-->
<!-- 设置上门内容 --> <!-- 设置上门内容 -->
<!-- 出发上门内容 --> <!-- 出发上门内容 -->
<template v-if="form.jsonStatus === 4">
<el-col :span="24">
<el-form-item label="备注" prop="orderLog.remark">
<el-input
v-model="form.orderLog.remark"
type="textarea"
placeholder="请输入备注"
/>
</el-form-item>
</el-col>
</template>
<!-- 出发上门内容 --> <!-- 出发上门内容 -->
<template v-if="form.jsonStatus === 5">
<el-col :span="24">
<el-form-item label="备注" prop="mark">
<el-input
v-model="form.mark"
type="textarea"
placeholder="请输入备注"
/>
</el-form-item>
</el-col>
</template>
<!-- 项目报价内容 --> <!-- 项目报价内容 -->
<template v-if="form.jsonStatus === 6"> <template v-if="form.jsonStatus === 6">
@ -617,6 +575,19 @@
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="服务项目合计" prop="servicePrice">
<el-input
v-model="form.servicePrice"
type="number"
placeholder="服务项目合计金额"
:disabled="true"
prefix-icon="el-icon-money"
>
<template slot="prepend"></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="物料" prop="materials"> <el-form-item label="物料" prop="materials">
<div class="materials"> <div class="materials">
@ -647,6 +618,19 @@
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="物料合计" prop="goodPrice">
<el-input
v-model="form.goodPrice"
type="number"
placeholder="物料合计金额"
:disabled="true"
prefix-icon="el-icon-money"
>
<template slot="prepend"></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="付款方式" prop="paymentMethod"> <el-form-item label="付款方式" prop="paymentMethod">
<el-radio-group v-model="form.paymentMethod" @change="handlePaymentMethodChange"> <el-radio-group v-model="form.paymentMethod" @change="handlePaymentMethodChange">
@ -688,15 +672,7 @@
</el-upload> </el-upload>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="备注" prop="mark">
<el-input
v-model="form.mark"
type="textarea"
placeholder="请输入备注"
/>
</el-form-item>
</el-col>
</template> </template>
<!-- 暂停内容 --> <!-- 暂停内容 -->
@ -723,6 +699,7 @@
v-model="form.pauseReason" v-model="form.pauseReason"
type="textarea" type="textarea"
placeholder="请输入暂停原因" placeholder="请输入暂停原因"
@change="handlePauseServiceData"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -734,18 +711,11 @@
placeholder="选择下次服务时间" placeholder="选择下次服务时间"
value-format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%" style="width: 100%"
@change="handlePauseServiceData"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24">
<el-form-item label="备注" prop="mark">
<el-input
v-model="form.mark"
type="textarea"
placeholder="请输入备注"
/>
</el-form-item>
</el-col>
</template> </template>
<!-- 完成服务内容 --> <!-- 完成服务内容 -->
@ -766,6 +736,8 @@
</el-upload> </el-upload>
</el-form-item> </el-form-item>
</el-col> </el-col>
</template>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注" prop="mark"> <el-form-item label="备注" prop="mark">
<el-input <el-input
@ -775,7 +747,6 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</template>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="预约时间" prop="makeTime"> <el-form-item label="预约时间" prop="makeTime">
<el-date-picker <el-date-picker
@ -859,7 +830,7 @@
<script> <script>
import { listOrder, getOrder, delOrder, addOrder, updateOrder,getUserDataList,getGoodsDataList,selectQuoteCraftList,selectQuoteMaterialList,selectBaseProjectList} from "@/api/system/Order" import { listOrder, getOrder, delOrder, addOrder, updateOrder,getUserDataList,getGoodsDataList,selectQuoteCraftList,generateCode,selectQuoteMaterialList,selectBaseProjectList} from "@/api/system/Order"
import { getuserAddressList } from "@/api/system/UserAddress" import { getuserAddressList } from "@/api/system/UserAddress"
import CallRecord from './components/CallRecord' import CallRecord from './components/CallRecord'
import AudioRecord from './components/AudioRecord' import AudioRecord from './components/AudioRecord'
@ -951,8 +922,10 @@ export default {
productId: null, productId: null,
type: 1, type: 1,
num: 1, num: 1,
totalPrice: null, servicePrice:0,
payPrice: null, goodPrice:0,
totalPrice: 0,
payPrice: 0,
deduction: null, deduction: null,
payTime: null, payTime: null,
status: 1, // status: 1, //
@ -1167,12 +1140,17 @@ export default {
}, },
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
this.generateCode()
this.reset() this.reset()
// //
this.form.serviceItems = [] this.form.serviceItems = []
this.form.materials = [] this.form.materials = []
this.form.price = 0 this.form.price = 0
this.form.servicePrice = 0
this.form.goodPrice = 0
this.form.baseProject = [] // this.form.baseProject = [] //
this.form.pauseReason = null //
this.form.nextServiceTime = null //
this.form.orderLog = { this.form.orderLog = {
workerId: 1, workerId: 1,
workerName: null, workerName: null,
@ -1231,6 +1209,17 @@ export default {
this.baseProjectList = [] this.baseProjectList = []
}) })
}, },
//
generateCode(){
generateCode().then(response => {
this.form.orderId=response.msg;
})
},
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row) { handleUpdate(row) {
this.reset() this.reset()
@ -1301,6 +1290,13 @@ export default {
url: url, url: url,
uid: Date.now() + index uid: Date.now() + index
})) }))
//
if (content.pauseReason) {
this.form.pauseReason = content.pauseReason;
}
if (content.nextServiceTime) {
this.form.nextServiceTime = content.nextServiceTime;
}
} }
// jsonStatus === 9 // jsonStatus === 9
@ -1533,23 +1529,46 @@ export default {
this.form.jsonStatus = null; this.form.jsonStatus = null;
}, },
handlejsonStatusChange(value) { handlejsonStatusChange(value) {
// //
//
this.form.workerId = null; this.form.workerId = null;
this.form.departureTime = null; this.form.departureTime = null;
this.form.arrivalTime = null; this.form.arrivalTime = null;
this.form.projectCost = null; this.form.projectCost = null;
this.form.baseProject = null; this.form.doorFee = null;
//
if (value !== 6) {
//
this.form.baseProject = [];
this.form.serviceItems = []; this.form.serviceItems = [];
this.form.materials = []; this.form.materials = [];
this.form.paymentMethod = 2; this.form.paymentMethod = 2;
this.form.deposit = 0; this.form.deposit = 0;
}
if (value !== 7) {
//
this.form.startTime = null; this.form.startTime = null;
}
if (value !== 8) {
//
this.form.pauseTime = null; this.form.pauseTime = null;
this.form.pauseReason = null; this.form.pauseReason = null;
this.form.nextServiceTime = null;
}
if (value !== 9) {
//
this.form.completeTime = null; this.form.completeTime = null;
this.form.doorFee = null; }
// 789
if (value !== 7 && value !== 8 && value !== 9) {
this.form.servicePhotos = []; this.form.servicePhotos = [];
this.form.nextServiceTime = null; // }
}, },
addServiceItem() { addServiceItem() {
this.form.serviceItems.push({ this.form.serviceItems.push({
@ -1620,6 +1639,24 @@ export default {
// = + + // = + +
const totalPrice = parseFloat(this.form.price || 0) + craftTotal + materialTotal; const totalPrice = parseFloat(this.form.price || 0) + craftTotal + materialTotal;
//
this.form.totalPrice = totalPrice;
// servicePrice
this.form.servicePrice = craftTotal;
// goodPrice
this.form.goodPrice = materialTotal;
//
if (this.form.paymentMethod === 1) {
// +
this.form.payPrice = this.form.orderLog.deposit || 0;
} else {
//
this.form.payPrice = totalPrice;
}
// //
const basicItems = this.form.baseProject.map(item => ({ name: item })); const basicItems = this.form.baseProject.map(item => ({ name: item }));
@ -1643,7 +1680,7 @@ export default {
name: "项目费用", name: "项目费用",
price: totalPrice, price: totalPrice,
paymentMethod: this.form.paymentMethod === 1 ? "定金+尾款" : "一次性付清", paymentMethod: this.form.paymentMethod === 1 ? "定金+尾款" : "一次性付清",
deposit: this.form.paymentMethod === 1 ? this.form.deposit : 0 deposit: this.form.paymentMethod === 1 ? this.form.orderLog.deposit : 0
}, },
basic: basicItems, basic: basicItems,
craft: craftItems, craft: craftItems,
@ -1659,23 +1696,19 @@ export default {
handlePhotoChange(file, fileList) { handlePhotoChange(file, fileList) {
this.form.servicePhotos = fileList; this.form.servicePhotos = fileList;
//
const imageUrls = fileList.map(file => {
// 使responseurl
if (file.response && file.response.url) {
return file.response.url;
}
// 使url
if (file.url) {
return file.url;
}
//
return '';
}).filter(url => url); //
// JSON // JSON
if (this.form.jsonStatus === 7) { if (this.form.jsonStatus === 7) {
// //
const imageUrls = fileList.map(file => {
if (file.response && file.response.url) {
return file.response.url;
}
if (file.url) {
return file.url;
}
return '';
}).filter(url => url);
const serviceImageJson = { const serviceImageJson = {
name: "师傅开始服务", name: "师傅开始服务",
image: imageUrls image: imageUrls
@ -1684,16 +1717,21 @@ export default {
console.log('开始服务图片JSON:', this.form.orderLog.content); console.log('开始服务图片JSON:', this.form.orderLog.content);
} else if (this.form.jsonStatus === 8) { } else if (this.form.jsonStatus === 8) {
// // -
const pauseImageJson = { this.handlePauseServiceData();
name: "服务暂停",
image: imageUrls
};
this.form.orderLog.content = JSON.stringify(pauseImageJson);
console.log('暂停服务图片JSON:', this.form.orderLog.content);
} else if (this.form.jsonStatus === 9) { } else if (this.form.jsonStatus === 9) {
// //
const imageUrls = fileList.map(file => {
if (file.response && file.response.url) {
return file.response.url;
}
if (file.url) {
return file.url;
}
return '';
}).filter(url => url);
const completeImageJson = { const completeImageJson = {
name: "服务完成", name: "服务完成",
image: imageUrls image: imageUrls
@ -1705,12 +1743,48 @@ export default {
handlePaymentMethodChange(value) { handlePaymentMethodChange(value) {
if (value === 2) { // if (value === 2) { //
this.form.orderLog.deposit = 0; // this.form.orderLog.deposit = 0; //
this.form.payPrice = this.form.totalPrice; //
} else if (value === 1) { // +
// 0
this.form.payPrice = this.form.orderLog.deposit || 0;
} }
this.updateQuoteContent(); this.updateQuoteContent();
}, },
handleDepositChange() { handleDepositChange() {
// +
if (this.form.paymentMethod === 1) {
this.form.payPrice = this.form.orderLog.deposit || 0;
}
this.updateQuoteContent(); this.updateQuoteContent();
}, },
//
handlePauseServiceData() {
if (this.form.jsonStatus === 8) {
//
const imageUrls = this.form.servicePhotos.map(file => {
// 使responseurl
if (file.response && file.response.url) {
return file.response.url;
}
// 使url
if (file.url) {
return file.url;
}
return '';
}).filter(url => url); //
// JSON
const pauseServiceJson = {
name: "服务暂停",
image: imageUrls,
pauseReason: this.form.pauseReason || "",
nextServiceTime: this.form.nextServiceTime || ""
};
this.form.orderLog.content = JSON.stringify(pauseServiceJson);
console.log('暂停服务数据JSON:', this.form.orderLog.content);
}
},
} }
} }
</script> </script>