package com.foreverwin.mesnac.anomaly.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.foreverwin.mesnac.anomaly.dto.AbnormalBillDto;
import com.foreverwin.mesnac.anomaly.model.AbnormalBill;
import com.foreverwin.mesnac.anomaly.model.AbnormalBillDispose;
import com.foreverwin.mesnac.anomaly.service.AbnormalBillService;
import com.foreverwin.mesnac.anomaly.service.FileUploadedService;
import com.foreverwin.mesnac.common.dto.SfcDispatchDto;
import com.foreverwin.mesnac.common.service.SfcDispatchCommonService;
import com.foreverwin.mesnac.meapi.service.NcCodeService;
import com.foreverwin.modular.core.util.FrontPage;
import com.foreverwin.modular.core.util.R;
import com.sap.me.frame.service.CommonMethods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

/**
 *
 * @author zjw
 * @since 2021-09-15
 */
@RestController
@RequestMapping("/Z-ABNORMAL-BILL")
public class AbnormalBillController {

    @Autowired
    public AbnormalBillService abnormalBillService;

    @Autowired
    private SfcDispatchCommonService sfcDispatchCommonService;

    @Autowired
    private FileUploadedService fileUploadedService;

    @Autowired
    private NcCodeService ncCodeService;

    /**
    * 根据id查询
    *
    * @param id 主键
    * @return
    */
    @ResponseBody
    @GetMapping("/{id:.+}")
    public R getAbnormalBillById(@PathVariable String id) {
        return R.ok( abnormalBillService.getById(id));
    }

    /**
     * 查询所有数据
     *
     * @return
     */
    @ResponseBody
    @GetMapping("")
    public R getAbnormalBillList(AbnormalBill abnormalBill){
        List<AbnormalBill> result;
        QueryWrapper<AbnormalBill> queryWrapper = new QueryWrapper<>();
        queryWrapper.setEntity(abnormalBill);
        result = abnormalBillService.list(queryWrapper);
        return R.ok(result);
    }

    /**
     * 分页查询数据
     *
     * @param frontPage  分页信息
     * @return
     */
    @ResponseBody
    @GetMapping("/page")
    public R page(FrontPage<AbnormalBill> frontPage, AbnormalBill abnormalBill){
        IPage result;
        QueryWrapper<AbnormalBill> queryWrapper = new QueryWrapper<>();
        String site = CommonMethods.getSite();
        abnormalBill.setSite(site);
        queryWrapper.setEntity(abnormalBill);
        if (frontPage.getGlobalQuery() != null && !"".equals(frontPage.getGlobalQuery().trim())) {
            //TODO modify global query
            queryWrapper.lambda().and(wrapper -> wrapper
                .like(AbnormalBill::getHandle, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getSite, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getAbnormalNo, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getStatus, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getCorrection, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getProgram, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getType, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getItemBo, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getSfc, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getOperation, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getWorkCenter, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getShopOrder, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getMessageType, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getResrce, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getNcCode, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getShutDown, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getResponseUser, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getPbDescription, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getNcQty, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getPbGrade, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getPbUser, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getPbQty, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getDiscover, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getInspector, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getEntityLocation, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getReportFrom, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getObjectBo, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getPbPhotoshop, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getCancelCode, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getCancelReason, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getCancelUser, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getReportSendUserGroup, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getCancelSendUserGroup, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getCreatedUser, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getModifiedUser, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getProductCategory, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getStepId, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getWorkOrder, frontPage.getGlobalQuery())
                .or().like(AbnormalBill::getItemNumber, frontPage.getGlobalQuery())
    );
        }
        result = abnormalBillService.page(frontPage.getPagePlus(), queryWrapper);
        return R.ok(result);
    }

    /**
     * 新增
     * @param abnormalBill  传递的实体
     * @return  null 失败  实体成功
     */
    @PostMapping
    public R save(@RequestBody AbnormalBill abnormalBill) {
        return R.ok(abnormalBillService.save(abnormalBill));
    }

    /**
     * 修改
     * @param abnormalBill  传递的实体
     * @return  null 失败  实体成功
     */
    @PutMapping
    public R updateById(@RequestBody AbnormalBill abnormalBill) {
        return R.ok(abnormalBillService.updateById(abnormalBill));
    }

    /**
     * 根据id删除对象
     * @param id  实体ID
     * @return 0 失败  1 成功
     */
    @ResponseBody
    @RequestMapping(method = RequestMethod.DELETE, value = "/{id:.+}")
    public R removeById(@PathVariable("id") String id){
        return R.ok(abnormalBillService.removeById(id));
    }

    /**
     * 批量删除对象
     * @param ids 实体集合ID
     * @return  0 失败  1 成功
     */
    @ResponseBody
    @RequestMapping(method = RequestMethod.POST, value = "/delete-batch")
    public R removeByIds(List<String> ids){
        return R.ok(abnormalBillService.removeByIds(ids));
    }

    /**
     * 拆分弹出框
     *
     * @return
     */
    @ResponseBody
    @GetMapping("getQCAbnormal")
    public R getQCAbnormal(){
        List<AbnormalBill> result;
        result = abnormalBillService.getQCAbnormal();
        return R.ok(result);
    }
    @GetMapping("getAbnormalSFCPage")
    public R getAbnormalSFCPage(FrontPage frontPage,@RequestParam(required =  false) Map paramMap){
        String globalQuery = frontPage.getGlobalQuery();
        return R.ok(abnormalBillService.getAbnormalSFCPage(frontPage.getPagePlus(),paramMap,globalQuery));
    }
    @GetMapping("getAbnormalByConditionalPage")
    public R getAbnormalByConditionalPage(FrontPage frontPage,@RequestParam(required =  false) Map paramMap){
        String globalQuery = frontPage.getGlobalQuery();
        return R.ok(abnormalBillService.getAbnormalByConditionalPage(frontPage.getPagePlus(),paramMap,globalQuery));
    }



    /**
     * 初始化
     * @param  type 异常的类型
     * @return
     */
    @GetMapping("/init")
    public R init(String type){
        return R.ok(abnormalBillService.init(type));
    }


    /**
     * 其他异常提报
     * @param abnormalBill
     * @return
     */
    @GetMapping("/anomalyReportOther")
    public R anomalyReportOther(AbnormalBill abnormalBill,
                                AbnormalBillDispose abnormalBillDispose,
                                @RequestParam List<String> dutyCauseType,
                                @RequestParam List<String> dutyType){
        return R.ok(abnormalBillService.anomalyReportOther(abnormalBill, abnormalBillDispose,dutyCauseType,dutyType));
    }

    /**
     * 质量异常提报
     * @param abnormalBill
     * @param abnormalBillDispose
     * @return
     */
    @GetMapping("/anomalyReport")
    public R anomalyReport(AbnormalBill abnormalBill,
                           AbnormalBillDispose abnormalBillDispose,
                           @RequestParam List<String> ncGroupAndNcCodes,
                           @RequestParam List<String> dutyCauseType,
                           @RequestParam List<String> dutyType){
        try{
            return R.ok(abnormalBillService.anomalyReport(abnormalBill, abnormalBillDispose,ncGroupAndNcCodes,dutyCauseType,dutyType));
        }catch(Exception e){
            return R.failed("质量异常提报失败:"+e.getMessage());
        }
    }

    /**
     * 设备异常提报
     * @param abnormalBill
     * @return
     */
    @GetMapping("/anomalyReportDevice")
    public R anomalyReportDevice(AbnormalBill abnormalBill, AbnormalBillDispose abnormalBillDispose){
        try{
            return R.ok(abnormalBillService.anomalyReportDevice(abnormalBill,abnormalBillDispose));
        }catch (Exception e){
            return R.failed("设备异常提报失败:"+e.getMessage());
        }

    }


    /**
     * 取消原因
     * @param handle
     * @param cancelBrowse
     * @return
     */
    @GetMapping("/cancelBrowse")
    public R cancelBrowse(String handle, String cancelBrowse,String code,String cancelSendUserGroup){
        try{
            return R.ok( abnormalBillService.cancelBrowse(handle,cancelBrowse,code,cancelSendUserGroup));
        }catch(Exception e){
            return R.failed("取消失败:"+e.getMessage());
        }
    }

    @GetMapping("/backLog")
    public R backLog(AbnormalBillDto abnormalBillDto){
        try{
            return R.ok(abnormalBillService.backLog(abnormalBillDto));
        }catch(Exception e){
            return R.failed("检索失败:"+e.getMessage());
        }

    }

    /**
     * 质量异常响应检索
     * @param abnormalBill
     * @return
     */
    @GetMapping("/findAllByAbnormalNo")
    public R findAllByAbnormalNo(AbnormalBill abnormalBill){
        try{
            return R.ok(abnormalBillService.findAllByAbnormalNo(abnormalBill));
        }catch (Exception e){
            return R.failed("检索失败:"+e.getMessage());
        }

    }

    /**
     * 设备异常响应检索
     */
    @GetMapping("/findAllByAbnormalNoDevice")
    public R findAllByAbnormalNoDevice(AbnormalBill abnormalBill){
        try{
            return R.ok(abnormalBillService.findAllByAbnormalNoDevice(abnormalBill));
        }catch (Exception e){
            return R.failed("设备异常响应检索失败:"+e.getMessage());
        }

    }

    /**
     * 响应处理
     * @param abnormalBill
     * @return
     */
    @GetMapping("/resProcessing")
    public R resProcessing(AbnormalBill abnormalBill){
        try{
            abnormalBillService.resProcessing(abnormalBill);
            return R.ok();
        }catch(Exception e){
            return R.failed("响应处理失败:"+e.getMessage());
        }
    }

    /**
     * 方案确认
     * @param abnormalBill
     * @param abnormalBillDispose
     * @return
     */
    @GetMapping("/programConfirm")
    public R programConfirm(AbnormalBill abnormalBill,AbnormalBillDispose abnormalBillDispose){
        try{
            abnormalBillService.programConfirm(abnormalBill,abnormalBillDispose);
            return R.ok();
        }catch (Exception e){
            return R.failed("方案确认失败:"+e.getMessage());
        }
    }

    /**
     * 判责提交
     * @param abnormalBill
     * @param abnormalBillDispose
     * @return
     */
    @GetMapping("/dutyConfirm")
    public R dutyConfirm(AbnormalBill abnormalBill,AbnormalBillDispose abnormalBillDispose,
                         @RequestParam List<String> dutyCauseType,
                         @RequestParam List<String> dutyType){
        try{
            abnormalBillService.dutyConfirm(abnormalBill,abnormalBillDispose,dutyCauseType,dutyType);
            return R.ok();
        }catch(Exception e){
            return R.failed("判责提交失败:"+e.getMessage());
        }
    }

    /**
     * 闭环关闭
     * @param abnormalBill
     * @param abnormalBillDispose
     * @return
     */
    @GetMapping("/anomalyShutDown")
    public  R anomalyShutDown(AbnormalBill abnormalBill,AbnormalBillDispose abnormalBillDispose){
        try{
            abnormalBillService.anomalyShutDown(abnormalBill,abnormalBillDispose);
            return R.ok();
        }catch (Exception e){
            return R.failed("闭环关闭失败:"+e.getMessage());
        }

    }

    @GetMapping("/findResrceAndWorkCenterBySfc")
    public R findResrceAndWorkCenterBySfc(SfcDispatchDto sfcDispatch){
        try{
            return R.ok(sfcDispatchCommonService.findResrceAndWorkCenterBySfc(sfcDispatch));
        }catch (Exception e){
            return R.failed("根据sfc查找设备和工作中心失败:"+e.getMessage());
        }
    }

    @GetMapping("/show")
    public R showFile(HttpServletRequest request, HttpServletResponse response) throws Exception {
        try{
            return R.ok(fileUploadedService.showFile(request,response));
        }catch (Exception e){
            return R.failed("显示图片失败:"+e.getMessage());
        }

    }

    @PostMapping("/delete")
    public R delete(String ftpPath,String fileName){
        try{
            fileUploadedService.deleteFile(ftpPath,fileName);
            return R.ok();
        }catch (Exception e){
            return R.failed("图片删除失败:"+e.getMessage());
        }
    }

    @GetMapping("/findUploadPictureByAbnormalBo")
    public R findUploadPictureByAbnormalBo(AbnormalBill abnormalBill){
        return R.ok(abnormalBillService.findUploadPictureByAbnormalBo(abnormalBill));
    }

    @GetMapping("/getNextNumber")
    public R getNextNumber(String type){
        return R.ok(abnormalBillService.getNextNumber(type));
    }

    @GetMapping("/clear")
    public R clear(String type){
        return R.ok(abnormalBillService.getNextNumber(type));
    }


    @GetMapping("/anomalyReveseRepair")
    public R anomalyReveseRepair(AbnormalBill abnormalBill, AbnormalBillDispose abnormalBillDispose){
        return R.ok(abnormalBillService.anomalyReveseRepair(abnormalBill,abnormalBillDispose));
    }

    @GetMapping("/findNcCodeDescriptionByNcCode")
    public R findNcCodeDescriptionByNcCode(String ncCode){
        return R.ok(ncCodeService.findNcCodeDescriptionByNcCode(ncCode));
    }

}