UpdateRepairStatusCmd.java 4.77 KB
/*
 * Copyright 2017-2020 吴学文 and java110 team.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.java110.user.cmd.property;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.java110.core.annotation.Java110Cmd;
import com.java110.core.annotation.Java110Transactional;
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.po.property.MessageNotifyPo;
import com.java110.po.property.RepairOrderPo;
import com.java110.user.dao.property.IMessageNotifyV1ServiceDao;
import com.java110.user.dao.property.IRepairOrderV1ServiceDao;
import com.java110.utils.exception.CmdException;
import com.java110.utils.util.Assert;
import com.java110.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;
import java.util.Map;

@Java110Cmd(serviceCode = "property.updateRepairStatus")
public class UpdateRepairStatusCmd extends Cmd {

    @Autowired
    private IRepairOrderV1ServiceDao repairOrderV1ServiceDao;
    @Autowired
    private IMessageNotifyV1ServiceDao messageNotifyV1ServiceDao;

    @Override
    public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) {
        Assert.hasKeyAndValue(reqJson, "id", "未包含工单ID");
        Assert.hasKeyAndValue(reqJson, "status", "未包含状态");
        String status = reqJson.getString("status");
        Assert.isTrue("PENDING".equals(status) || "REPAIRING".equals(status)
                || "COMPLETED".equals(status) || "CANCELLED".equals(status),
                "状态必须为: PENDING/REPAIRING/COMPLETED/CANCELLED");
        if ("COMPLETED".equals(status)) {
            Assert.hasKeyAndValue(reqJson, "repairResult", "维修完成必须填写维修结果");
            Assert.hasKeyAndValue(reqJson, "resultImages", "维修完成必须上传结果图片");
            JSONArray resultImages = reqJson.getJSONArray("resultImages");
            if (resultImages == null || resultImages.isEmpty()) {
                throw new CmdException("维修完成至少上传1张结果图片");
            }
        }
    }

    @Override
    @Java110Transactional
    public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
        RepairOrderPo po = new RepairOrderPo();
        po.setId(reqJson.getString("id"));
        po.setStatus(reqJson.getString("status"));

        String status = reqJson.getString("status");
        if ("REPAIRING".equals(status)) {
            if (reqJson.containsKey("repairerId")) {
                po.setRepairerId(reqJson.getString("repairerId"));
            }
            po.setAcceptTime(new Date());
        } else if ("COMPLETED".equals(status)) {
            po.setCompleteTime(new Date());
            po.setRepairResult(reqJson.getString("repairResult"));
            JSONArray resultImagesArr = reqJson.getJSONArray("resultImages");
            po.setResultImages(resultImagesArr != null ? resultImagesArr.toJSONString() : null);
        }

        repairOrderV1ServiceDao.updateRepairOrder(po);

        Map orderMap = repairOrderV1ServiceDao.queryRepairOrderById(reqJson.getString("id"));
        if (orderMap != null && orderMap.get("submitter_id") != null) {
            String statusName = getStatusName(status);
            MessageNotifyPo notify = new MessageNotifyPo();
            notify.setId(GenerateCodeFactory.getGeneratorId("30"));
            notify.setUserId((String) orderMap.get("submitter_id"));
            notify.setTitle("工单状态更新");
            notify.setContent("您的工单【" + orderMap.get("title") + "】状态已更新为:" + statusName);
            notify.setMsgType("REPAIR_STATUS");
            notify.setRelateId(reqJson.getString("id"));
            messageNotifyV1ServiceDao.saveMessageNotify(notify);
        }

        context.setResponseEntity(ResultVo.success());
    }

    private String getStatusName(String status) {
        switch (status) {
            case "PENDING": return "待接单";
            case "REPAIRING": return "维修中";
            case "COMPLETED": return "已完成";
            case "CANCELLED": return "已取消";
            default: return status;
        }
    }
}