package com.java110.community.cmd.ownerRepair; import com.alibaba.fastjson.JSONObject; import com.java110.config.properties.code.Java110Properties; import com.java110.core.annotation.Java110Cmd; import com.java110.core.annotation.Java110Transactional; import com.java110.core.context.Environment; import com.java110.core.context.ICmdDataFlowContext; import com.java110.core.event.cmd.Cmd; import com.java110.core.event.cmd.CmdEvent; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.fee.FeeAttrDto; import com.java110.dto.fee.FeeDto; import com.java110.dto.repair.RepairDto; import com.java110.dto.repair.RepairUserDto; import com.java110.intf.community.IRepairInnerServiceSMO; import com.java110.intf.community.IRepairPoolV1InnerServiceSMO; import com.java110.intf.community.IRepairUserInnerServiceSMO; import com.java110.intf.community.IRepairUserV1InnerServiceSMO; import com.java110.intf.fee.IFeeAttrInnerServiceSMO; import com.java110.intf.fee.IFeeInnerServiceSMO; import com.java110.intf.fee.IPayFeeV1InnerServiceSMO; import com.java110.po.fee.PayFeePo; import com.java110.po.owner.RepairPoolPo; import com.java110.po.owner.RepairUserPo; import com.java110.utils.cache.MappingCache; import com.java110.utils.constant.MappingConstant; import com.java110.utils.exception.CmdException; import com.java110.utils.util.Assert; import com.java110.utils.util.BeanConvertUtil; import com.java110.utils.util.DateUtil; import com.java110.utils.util.ListUtil; import com.java110.vo.ResultVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import java.text.ParseException; import java.util.Calendar; import java.util.Date; import java.util.List; @Java110Cmd(serviceCode = "ownerRepair.repairDispatch") public class RepairDispatchCmd extends Cmd { //派单 public static final String ACTION_DISPATCH = "DISPATCH"; //转单 public static final String ACTION_TRANSFER = "TRANSFER"; //退单 public static final String ACTION_BACK = "BACK"; @Autowired private IRepairUserInnerServiceSMO repairUserInnerServiceSMOImpl; @Autowired private IRepairInnerServiceSMO repairInnerServiceSMOImpl; @Autowired private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl; @Autowired private IFeeInnerServiceSMO feeInnerServiceSMOImpl; @Autowired private Java110Properties java110Properties; @Autowired private IPayFeeV1InnerServiceSMO payFeeV1InnerServiceSMOImpl; @Autowired private IRepairPoolV1InnerServiceSMO repairPoolV1InnerServiceSMOImpl; @Autowired private IRepairUserV1InnerServiceSMO repairUserV1InnerServiceSMOImpl; //域 public static final String DOMAIN_COMMON = "DOMAIN.COMMON"; //键(维修师傅未处理最大单数) public static final String REPAIR_NUMBER = "REPAIR_NUMBER"; @Override public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException { Assert.hasKeyAndValue(reqJson, "staffId", "未包含员工ID信息"); Assert.hasKeyAndValue(reqJson, "staffName", "未包含员工名称信息"); Assert.hasKeyAndValue(reqJson, "repairId", "未包含报修单信息"); Assert.hasKeyAndValue(reqJson, "context", "未包含派单内容"); Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区信息"); Assert.hasKeyAndValue(reqJson, "action", "未包含处理动作"); if (!reqJson.containsKey("userId")) { reqJson.put("userId", context.getReqHeaders().get("user-id")); } } @Override @Java110Transactional public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException { // RepairUserPo repairUserPo = BeanConvertUtil.covertBean(reqJson, RepairUserPo.class); String action = reqJson.getString("action"); switch (action) { case ACTION_DISPATCH: //派单 dispacthRepair(context, reqJson); break; case ACTION_TRANSFER: //转单 transferRepair(context, reqJson); break; case ACTION_BACK: //退单 backRepair(context, reqJson); break; } } private void backRepair(ICmdDataFlowContext context, JSONObject reqJson) { //查询订单状态 RepairDto repairDto = new RepairDto(); repairDto.setRepairId(reqJson.getString("repairId")); repairDto.setCommunityId(reqJson.getString("communityId")); List repairDtos = repairInnerServiceSMOImpl.queryRepairs(repairDto); Assert.listOnlyOne(repairDtos, "当前用户没有需要处理订单或存在多条"); int flag = 0; //待评价 if (RepairDto.STATE_APPRAISE.equals(repairDtos.get(0).getState())) { FeeAttrDto feeAttrDto = new FeeAttrDto(); feeAttrDto.setCommunityId(reqJson.getString("communityId")); feeAttrDto.setSpecCd(FeeAttrDto.SPEC_CD_REPAIR); feeAttrDto.setValue(reqJson.getString("repairId")); List feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto); if (!ListUtil.isNull(feeAttrDtos)) { FeeDto feeDto = new FeeDto(); feeDto.setCommunityId(reqJson.getString("communityId")); feeDto.setFeeId(feeAttrDtos.get(0).getFeeId()); List feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto); //收费结束 if (FeeDto.STATE_FINISH.equals(feeDtos.get(0).getState())) { ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_BUSINESS_VERIFICATION, "收费结束,不能退单!"); context.setResponseEntity(responseEntity); return; } PayFeePo payFeePo = new PayFeePo(); payFeePo.setCommunityId(feeDtos.get(0).getCommunityId()); payFeePo.setFeeId(feeDtos.get(0).getFeeId()); //删除费用 flag = payFeeV1InnerServiceSMOImpl.deletePayFee(payFeePo); if (flag < 1) { throw new CmdException("删除费用失败"); } //删除费用属性 // FeeAttrPo feeAttrPo = new FeeAttrPo(); // feeAttrPo.setAttrId(feeAttrDtos.get(0).getAttrId()); // feeAttrPo.setCommunityId(feeAttrDtos.get(0).getCommunityId()); // super.delete(context, feeAttrPo, BusinessTypeConstant.BUSINESS_TYPE_DELETE_FEE_INFO); // flag = feeAttrInnerServiceSMOImpl.d(payFeePo); // if (flag < 1) { // throw new CmdException("删除费用失败"); // } } ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_OK, ResultVo.MSG_OK); context.setResponseEntity(responseEntity); } RepairUserDto repairUserDto = new RepairUserDto(); repairUserDto.setRepairId(reqJson.getString("repairId")); repairUserDto.setCommunityId(reqJson.getString("communityId")); //todo 这里考虑带评价 repairUserDto.setStates(new String[]{RepairUserDto.STATE_DOING,RepairUserDto.STATE_EVALUATE}); repairUserDto.setStaffId(reqJson.getString("userId")); List repairUserDtos = repairUserInnerServiceSMOImpl.queryRepairUsers(repairUserDto); if (ListUtil.isNull(repairUserDtos)) { ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_BUSINESS_VERIFICATION, "当前用户没有需要处理订单!"); context.setResponseEntity(responseEntity); return; } RepairUserDto repair = new RepairUserDto(); repair.setRepairId(reqJson.getString("repairId")); repair.setStaffId(reqJson.getString("staffId")); repair.setCommunityId(reqJson.getString("communityId")); repair.setStates(new String[]{RepairUserDto.STATE_TRANSFER, RepairUserDto.STATE_CLOSE, RepairUserDto.STATE_STOP,RepairUserDto.STATE_EVALUATE}); List repairUsers = repairUserInnerServiceSMOImpl.queryRepairUsers(repair); if (ListUtil.isNull(repairUsers)) { //指派的不能退单 if (RepairDto.REPAIR_WAY_GRABBING.equals(repairDtos.get(0).getRepairWay()) || RepairDto.REPAIR_WAY_TRAINING.equals(repairDtos.get(0).getRepairWay())) { //抢单、轮训 modifyBusinessRepairDispatch(reqJson, RepairDto.STATE_WAIT);//维修单变成未派单 //把自己改成退单 RepairUserPo repairUser = new RepairUserPo(); repairUser.setRuId(repairUserDtos.get(0).getRuId()); repairUser.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); repairUser.setState(RepairUserDto.STATE_BACK); repairUser.setContext(reqJson.getString("context")); repairUser.setCommunityId(reqJson.getString("communityId")); flag = repairUserV1InnerServiceSMOImpl.updateRepairUserNew(repairUser); if (flag < 1) { throw new CmdException("修改用户失败"); } return; } else { ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_BUSINESS_VERIFICATION, "非常抱歉当前不能退单,报修设置为指派模式不可进行退单!"); context.setResponseEntity(responseEntity); return; } } //把自己改成退单 RepairUserPo repairUser = new RepairUserPo(); repairUser.setRuId(repairUserDtos.get(0).getRuId()); repairUser.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); repairUser.setState(RepairUserDto.STATE_BACK); repairUser.setContext(reqJson.getString("context")); repairUser.setCommunityId(reqJson.getString("communityId")); flag = repairUserV1InnerServiceSMOImpl.updateRepairUserNew(repairUser); if (flag < 1) { throw new CmdException("修改用户失败"); } RepairUserPo repairUserPo = new RepairUserPo(); repairUserPo.setRuId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_ruId)); repairUserPo.setRepairId(reqJson.getString("repairId")); repairUserPo.setbId("-1"); repairUserPo.setCommunityId(reqJson.getString("communityId")); repairUserPo.setCreateTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); repairUserPo.setState(RepairUserDto.STATE_DOING); repairUserPo.setContext(""); repairUserPo.setStaffId(repairUserDtos.get(0).getPreStaffId()); repairUserPo.setStaffName(repairUserDtos.get(0).getPreStaffName()); repairUserPo.setPreStaffId(repairUserDtos.get(0).getStaffId()); repairUserPo.setPreStaffName(repairUserDtos.get(0).getStaffName()); repairUserPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); repairUserPo.setRepairEvent(RepairUserDto.REPAIR_EVENT_AUDIT_USER); repairUserPo.setPreRuId(repairUserDtos.get(0).getRuId()); flag = repairUserV1InnerServiceSMOImpl.saveRepairUserNew(repairUserPo); if (flag < 1) { throw new CmdException("修改用户失败"); } modifyBusinessRepairDispatch(reqJson, RepairDto.STATE_BACK); } /** * 转单 * * @param context * @param reqJson */ private void transferRepair(ICmdDataFlowContext context, JSONObject reqJson) { //获取接受转单的员工 String staffId = reqJson.getString("staffId"); int flag = 0; RepairDto repair = new RepairDto(); repair.setStaffId(staffId); repair.setState("10001"); //处理中 int i = repairInnerServiceSMOImpl.queryStaffRepairsCount(repair); //取出开关映射的值(维修师傅未处理最大单数) String repairNumber = MappingCache.getValue(MappingConstant.REPAIR_DOMAIN, REPAIR_NUMBER); if (i >= Integer.parseInt(repairNumber)) { ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_BUSINESS_VERIFICATION, "该员工有超过" + Integer.parseInt(repairNumber) + "条未处理的订单急需处理,请安排其他维修人员处理!"); context.setResponseEntity(responseEntity); return; } String userId = reqJson.getString("userId"); String userName = reqJson.getString("userName"); RepairUserDto repairUserDto = new RepairUserDto(); repairUserDto.setRepairId(reqJson.getString("repairId")); repairUserDto.setCommunityId(reqJson.getString("communityId")); repairUserDto.setState(RepairUserDto.STATE_DOING); repairUserDto.setStaffId(userId); List repairUserDtos = repairUserInnerServiceSMOImpl.queryRepairUsers(repairUserDto); if (repairUserDtos != null && repairUserDtos.size() != 1) { ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_BUSINESS_VERIFICATION, "当前用户没有需要处理订单!"); context.setResponseEntity(responseEntity); return; } //更改转单者的信息 RepairUserPo repairUserPo = new RepairUserPo(); repairUserPo.setRuId(repairUserDtos.get(0).getRuId()); repairUserPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); repairUserPo.setState(RepairUserDto.STATE_TRANSFER); repairUserPo.setContext(reqJson.getString("context")); repairUserPo.setCommunityId(reqJson.getString("communityId")); flag = repairUserV1InnerServiceSMOImpl.updateRepairUserNew(repairUserPo); if (flag < 1) { throw new CmdException("修改用户失败"); } //处理人信息 repairUserPo = new RepairUserPo(); repairUserPo.setRuId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_ruId)); repairUserPo.setState(RepairUserDto.STATE_DOING); repairUserPo.setRepairId(reqJson.getString("repairId")); repairUserPo.setStaffId(reqJson.getString("staffId")); repairUserPo.setStaffName(reqJson.getString("staffName")); repairUserPo.setPreStaffId(userId); repairUserPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); repairUserPo.setPreStaffName(userName); repairUserPo.setPreRuId(repairUserDtos.get(0).getRuId()); repairUserPo.setRepairEvent(RepairUserDto.REPAIR_EVENT_AUDIT_USER); repairUserPo.setContext(""); repairUserPo.setCommunityId(reqJson.getString("communityId")); flag = repairUserV1InnerServiceSMOImpl.saveRepairUserNew(repairUserPo); if (flag < 1) { throw new CmdException("修改用户失败"); } modifyBusinessRepairDispatch(reqJson, RepairDto.STATE_TRANSFER); ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_OK, ResultVo.MSG_OK); context.setResponseEntity(responseEntity); } /** * 派单处理 * * @param context * @param reqJson */ private void dispacthRepair(ICmdDataFlowContext context, JSONObject reqJson) { int flag = 0; //获取接受派单的员工 String staffId = reqJson.getString("staffId"); RepairDto repair = new RepairDto(); repair.setStaffId(staffId); repair.setState("1100"); //接单状态 int i = repairInnerServiceSMOImpl.queryStaffRepairsCount(repair); //取出开关映射的值(维修师傅未处理最大单数) String repairNumber = MappingCache.getValue(MappingConstant.REPAIR_DOMAIN, REPAIR_NUMBER); if (i >= Integer.parseInt(repairNumber)) { ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_BUSINESS_VERIFICATION, "该员工有超过" + Integer.parseInt(repairNumber) + "条未处理的订单急需处理,请安排其他维修人员处理!"); context.setResponseEntity(responseEntity); return; } //手机端处理 if (Environment.isOwnerPhone(java110Properties)) { modifyBusinessRepairDispatch(reqJson, RepairDto.STATE_TAKING); return; } //获取报修id String repairId = reqJson.getString("repairId"); RepairDto repairDto = new RepairDto(); repairDto.setRepairId(repairId); List repairDtos = repairInnerServiceSMOImpl.queryRepairs(repairDto); if (repairDtos == null || repairDtos.size() != 1) { ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "数据错误!"); context.setResponseEntity(responseEntity); } else { //获取状态 String state = repairDtos.get(0).getState(); if (state.equals("1000")) { //1000表示未派单 String userId = reqJson.getString("userId"); String userName = reqJson.getString("userName"); String ruId = GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_ruId); // 自己的单子状态修改为派单 RepairUserPo repairUserPo = new RepairUserPo(); repairUserPo.setRuId(ruId); repairUserPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); repairUserPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); repairUserPo.setState(RepairUserDto.STATE_DISPATCH); repairUserPo.setRepairId(reqJson.getString("repairId")); repairUserPo.setStaffId(userId); repairUserPo.setStaffName(userName); freshPreStaff(reqJson, repairUserPo); repairUserPo.setRepairEvent(RepairUserDto.REPAIR_EVENT_AUDIT_USER); repairUserPo.setContext(reqJson.getString("context")); repairUserPo.setCommunityId(reqJson.getString("communityId")); flag = repairUserV1InnerServiceSMOImpl.saveRepairUserNew(repairUserPo); if (flag < 1) { throw new CmdException("修改用户失败"); } //处理人信息 repairUserPo = new RepairUserPo(); repairUserPo.setRuId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_ruId)); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.add(Calendar.SECOND, 30); repairUserPo.setStartTime(DateUtil.getFormatTimeString(calendar.getTime(), DateUtil.DATE_FORMATE_STRING_A)); repairUserPo.setState(RepairUserDto.STATE_DOING); repairUserPo.setRepairId(reqJson.getString("repairId")); repairUserPo.setStaffId(reqJson.getString("staffId")); repairUserPo.setStaffName(reqJson.getString("staffName")); repairUserPo.setPreStaffId(userId); repairUserPo.setPreStaffName(userName); repairUserPo.setPreRuId(ruId); repairUserPo.setRepairEvent(RepairUserDto.REPAIR_EVENT_AUDIT_USER); repairUserPo.setContext(""); repairUserPo.setCommunityId(reqJson.getString("communityId")); flag = repairUserV1InnerServiceSMOImpl.saveRepairUserNew(repairUserPo); if (flag < 1) { throw new CmdException("修改用户失败"); } modifyBusinessRepairDispatch(reqJson, RepairDto.STATE_TAKING); ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_OK, ResultVo.MSG_OK); context.setResponseEntity(responseEntity); } else if (state.equals("1100")) { //1100表示接单 ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "该订单处于接单状态,无法进行派单!"); context.setResponseEntity(responseEntity); } else { ResponseEntity responseEntity = ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "状态异常!"); context.setResponseEntity(responseEntity); } } } /** * 刷入上一处理人 * * @param reqJson * @param repairUserPo */ private void freshPreStaff(JSONObject reqJson, RepairUserPo repairUserPo) { RepairUserDto repairUserDto = new RepairUserDto(); repairUserDto.setRepairId(reqJson.getString("repairId")); repairUserDto.setCommunityId(reqJson.getString("communityId")); //repairUserDto.setRepairEvent(RepairUserDto.REPAIR_EVENT_START_USER); List repairUserDtos = repairUserInnerServiceSMOImpl.queryRepairUsers(repairUserDto); if (repairUserDtos == null || repairUserDtos.size() < 1) { repairUserPo.setPreStaffId("-1"); repairUserPo.setPreStaffName("-1"); repairUserPo.setPreRuId("-1"); } else { int pos = repairUserDtos.size() - 1; repairUserPo.setPreStaffId(repairUserDtos.get(pos).getStaffId()); repairUserPo.setPreStaffName(repairUserDtos.get(pos).getStaffName()); repairUserPo.setPreRuId(repairUserDtos.get(pos).getRuId()); } } public void modifyBusinessRepairDispatch(JSONObject paramInJson, String state) { //查询报修单 RepairDto repairDto = new RepairDto(); repairDto.setRepairId(paramInJson.getString("repairId")); List repairDtos = repairInnerServiceSMOImpl.queryRepairs(repairDto); Assert.isOne(repairDtos, "查询到多条数据,repairId=" + repairDto.getRepairId()); JSONObject businessOwnerRepair = new JSONObject(); businessOwnerRepair.putAll(BeanConvertUtil.beanCovertMap(repairDtos.get(0))); businessOwnerRepair.put("state", state); RepairPoolPo repairPoolPo = BeanConvertUtil.covertBean(businessOwnerRepair, RepairPoolPo.class); int flag = repairPoolV1InnerServiceSMOImpl.updateRepairPoolNew(repairPoolPo); if (flag < 1) { throw new CmdException("修改工单失败"); } } }