package com.ruoyi.tc.controller;


import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.tc.entity.*;
import com.ruoyi.tc.entity.po.*;
import com.ruoyi.tc.entity.request.AssetCurrentPageRequest;
import com.ruoyi.tc.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 现有资产表(AssetCurrent)表控制层
 *
 * @author makejava
 * @since 2024-11-15 10:03:56
 */
@Api(tags = "现有资产表")
@RestController
@RequestMapping("/tc/assetCurrent")
public class AssetCurrentController extends BaseController {
    /**
     * 服务对象
     */
    @Resource
    private AssetCurrentService assetCurrentService;
    @Resource
    private AssetSupplyChainService assetSupplyChainService;

    @Resource
    private AssetBasicNetworkService assetBasicNetworkService;

    @Resource
    private AssetBusinessFormService assetBusinessFormService;

    @Resource
    private UnitOtherConcatService unitOtherConcatService;

    @Resource
    private AssetTaskService assetTaskService;

    @Resource
    private AssetCurrentCpService assetCurrentCpService;

    @Resource
    private AssetBusinessFormCpService assetBusinessFormCpService;

    @Resource
    private AssetSupplyChainCpService assetSupplyChainCpService;


    @Resource
    private AssetBasicNetworkCpService assetBasicNetworkCpService;


    @Resource
    private UnitOtherConcatCpService unitOtherConcatCpService;

    @Resource
    private UnitService unitService;

    /**
     * 分页查询所有数据
     *
     * @param as 查询实体
     * @return 所有数据
     */
    @ApiOperation(value = "分页查询所有数据", response = AssetCurrent.class)
    @GetMapping
    public AjaxResult selectAll(AssetCurrentPageRequest as) {
        Page<AssetCurrent> page = new Page<>();
        page.setSize(as.getSize());
        page.setCurrent(as.getCurrent());
        try {
            if (!SecurityUtils.getLoginUser().getUser().isAdmin() && !SecurityUtils.hasRole("common")) {
                as.setDwmc(SecurityUtils.getLoginUser().getUser().getNickName());
            }
        } catch (Exception e) {
            throw new ServiceException("获取用户信息异常");
        }
        return success(assetCurrentService.page(page, as));
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @ApiOperation(value = "通过主键查询单条数据", response = AssetCurrent.class)
    @GetMapping("{id}")
    public AjaxResult selectOne(@PathVariable Serializable id) {
        return success(assetCurrentService.selectOne(id));
    }

    /**
     * 新增数据
     *
     * @param assetCurrent 实体对象
     * @return 新增结果
     */
    @ApiOperation(value = "新增数据")
    @PostMapping
    @PreAuthorize("@ss.hasAnyRoles('admin,common')")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult insert(@RequestBody @Valid AssetCurrent assetCurrent) {
        StringBuilder a = new StringBuilder();
        if (assetCurrent.getGlymList() != null) {
            assetCurrent.getGlymList().forEach(x -> {
                a.append(x.getKey());
                a.append(",");
            });
        }
        assetCurrent.setGlym(a.toString());
        StringBuilder b = new StringBuilder();
        if (assetCurrent.getGlIpList() != null) {
            assetCurrent.getGlymList().forEach(x -> {
                b.append(x.getKey());
                b.append(",");
            });
        }
        assetCurrent.setGlIp(b.toString());
        assetCurrentService.save(assetCurrent);
        //新增新监管业务形态
        if (assetCurrent.getXjgywxt() != null) {
            assetCurrent.getXjgywxt().setAssetId(assetCurrent.getId());
            assetBusinessFormService.save(assetCurrent.getXjgywxt());
        }
        if (assetCurrent.getGylxxList() != null) {
            for (AssetSupplyChain items : assetCurrent.getGylxxList()) {
                items.setAssetId(assetCurrent.getId());
            }
            //新增供应链
            assetSupplyChainService.saveBatch(assetCurrent.getGylxxList());
        }
        if (assetCurrent.getJcwlList() != null) {
            for (AssetBasicNetwork items : assetCurrent.getJcwlList()) {
                items.setAssetId(assetCurrent.getId());
            }
            //新增基础网络
            assetBasicNetworkService.saveBatch(assetCurrent.getJcwlList());
        }
        if (assetCurrent.getOtherConcat() != null) {
            for (UnitOtherConcat items : assetCurrent.getOtherConcat()) {
                items.setAssetId(assetCurrent.getId());
            }
            //新增其他联系人
            unitOtherConcatService.saveBatch(assetCurrent.getOtherConcat());
        }
        // 单位有进行中的任务时，管理端新增该单位下的资产则需同步至当前进行中的任务中。
        //获取新增资产id
        Long id = assetCurrent.getId();
        Integer i = unitService.selectTaskId(assetCurrent.getDwmc(), "0");

        //新增资产复制主表
        AssetCurrentCpPo assetCurrentCpPo = new AssetCurrentCpPo();
        BeanUtil.copyProperties(assetCurrent, assetCurrentCpPo);
        assetCurrentCpPo.setTaskId(i);
        assetCurrentCpService.save(assetCurrentCpPo);
        //新增新监管业务形态
        //根据资产id查询新监管业务形态主表id
        if (assetCurrent.getXjgywxt() != null) {
            assetCurrentCpPo.getXjgywxt().setAssetId(id);
            assetCurrentCpPo.getXjgywxt().setTaskId(i);
            assetBusinessFormCpService.save(assetCurrentCpPo.getXjgywxt());
        }
        if (assetCurrent.getGylxxList() != null) {
            for (AssetSupplyChainCpPo items : assetCurrentCpPo.getGylxxList()) {
                items.setAssetId(id);
                items.setTaskId(i);
            }
            //新增供应链
            assetSupplyChainCpService.saveBatch(assetCurrentCpPo.getGylxxList());
        }
        if (assetCurrent.getJcwlList() != null) {
            for (AssetBasicNetworkCpPo items : assetCurrentCpPo.getJcwlList()) {
                items.setAssetId(assetCurrent.getId());
                items.setTaskId(i);
            }
            //新增基础网络
            assetBasicNetworkCpService.saveBatch(assetCurrentCpPo.getJcwlList());
        }
        if (assetCurrent.getOtherConcat() != null) {
            for (UnitOtherConcatCpPo items : assetCurrentCpPo.getOtherConcat()) {
                items.setAssetId(assetCurrent.getId());
                items.setTaskId(i);
            }
            //新增其他联系人
            unitOtherConcatCpService.saveBatch(assetCurrentCpPo.getOtherConcat());
        }

        return success();
    }

    /**
     * 修改数据
     *
     * @param assetCurrent 实体对象
     * @return 修改结果
     */
    @ApiOperation(value = "修改数据")
    @PreAuthorize("@ss.hasAnyRoles('admin,common')")
    @PutMapping
    public AjaxResult update(@RequestBody @Valid AssetCurrent assetCurrent) {
        StringBuilder a = new StringBuilder();
        if (assetCurrent.getGlymList() != null) {
            assetCurrent.getGlymList().forEach(x -> {
                a.append(x.getKey());
                a.append(",");
            });
        }
        assetCurrent.setGlym(a.toString());
        StringBuilder b = new StringBuilder();
        if (assetCurrent.getGlIpList() != null) {
            assetCurrent.getGlymList().forEach(x -> {
                b.append(x.getKey());
                b.append(",");
            });
        }
        assetCurrent.setGlIp(b.toString());
        assetCurrentService.updateById(assetCurrent);
        assetSupplyChainService.deleteByAssetIds(assetCurrent.getId());
        assetBasicNetworkService.deleteByAssetIds(assetCurrent.getId());
        assetBusinessFormService.deleteByAssetIds(assetCurrent.getId());
        unitOtherConcatService.deleteByAssetIds(assetCurrent.getId());
        if (assetCurrent.getXjgywxt() != null) {
            assetCurrent.getXjgywxt().setAssetId(assetCurrent.getId());
            assetCurrent.getXjgywxt().setId(null);
            assetBusinessFormService.save(assetCurrent.getXjgywxt());
        }
        if (assetCurrent.getGylxxList() != null) {
            for (AssetSupplyChain items : assetCurrent.getGylxxList()) {
                items.setAssetId(assetCurrent.getId());
                items.setId(null);
            }
            //新增供应链
            assetSupplyChainService.saveBatch(assetCurrent.getGylxxList());
        }
        if (assetCurrent.getJcwlList() != null) {
            for (AssetBasicNetwork items : assetCurrent.getJcwlList()) {
                items.setAssetId(assetCurrent.getId());
                items.setId(null);
            }
            //新增基础网络
            assetBasicNetworkService.saveBatch(assetCurrent.getJcwlList());
        }
        if (assetCurrent.getOtherConcat() != null) {
            for (UnitOtherConcat items : assetCurrent.getOtherConcat()) {
                items.setAssetId(assetCurrent.getId());
                items.setConcatId(null);
            }
            //新增其他联系人
            unitOtherConcatService.saveBatch(assetCurrent.getOtherConcat());
        }
        //================================

        QueryWrapper<AssetCurrentCpPo> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("id", assetCurrent.getId());
        assetCurrentCpService.remove(queryWrapper1);

        Integer i = unitService.selectTaskId(assetCurrent.getDwmc(), "0");
        AssetCurrentCpPo assetCurrentCpPo = new AssetCurrentCpPo();
        BeanUtil.copyProperties(assetCurrent, assetCurrentCpPo);
        assetCurrentCpPo.setTaskId(i);
        assetCurrentCpService.save(assetCurrentCpPo);

        QueryWrapper<AssetSupplyChainCpPo> queryWrapper2 = new QueryWrapper<>();
        queryWrapper2.eq("asset_id", assetCurrent.getId());
        assetSupplyChainCpService.remove(queryWrapper2);
        QueryWrapper<AssetBasicNetworkCpPo> queryWrapper3 = new QueryWrapper<>();
        queryWrapper3.eq("asset_id", assetCurrent.getId());
        assetBasicNetworkCpService.remove(queryWrapper3);
        QueryWrapper<AssetBusinessFormCpPo> queryWrapper4 = new QueryWrapper<>();
        queryWrapper4.eq("asset_id", assetCurrent.getId());
        assetBusinessFormCpService.remove(queryWrapper4);
        QueryWrapper<UnitOtherConcatCpPo> queryWrapper5 = new QueryWrapper<>();
        queryWrapper5.eq("asset_id", assetCurrent.getId());
        unitOtherConcatCpService.remove(queryWrapper5);

        if (assetCurrent.getXjgywxt() != null) {
            assetCurrentCpPo.getXjgywxt().setAssetId(assetCurrent.getId());
            assetCurrentCpPo.getXjgywxt().setTaskId(i);
            assetBusinessFormCpService.save(assetCurrentCpPo.getXjgywxt());
        }
        if (assetCurrent.getGylxxList() != null) {
            for (AssetSupplyChainCpPo items : assetCurrentCpPo.getGylxxList()) {
                items.setAssetId(assetCurrent.getId());
                items.setTaskId(i);
            }
            //新增供应链
            assetSupplyChainCpService.saveBatch(assetCurrentCpPo.getGylxxList());
        }
        if (assetCurrent.getJcwlList() != null) {
            for (AssetBasicNetworkCpPo items : assetCurrentCpPo.getJcwlList()) {
                items.setAssetId(assetCurrent.getId());
                items.setTaskId(i);
            }
            //新增基础网络
            assetBasicNetworkCpService.saveBatch(assetCurrentCpPo.getJcwlList());
        }
        if (assetCurrent.getOtherConcat() != null) {
            for (UnitOtherConcatCpPo items : assetCurrentCpPo.getOtherConcat()) {
                items.setAssetId(assetCurrent.getId());
                items.setTaskId(i);
            }
            //新增其他联系人
            unitOtherConcatCpService.saveBatch(assetCurrentCpPo.getOtherConcat());
        }


        return success();
    }

    /**
     * 删除数据
     *
     * @param id 主键
     * @return 删除结果
     */
    @PreAuthorize("@ss.hasAnyRoles('admin,common')")
    @ApiOperation(value = "删除数据")
    @DeleteMapping("/{id}")
    public AjaxResult delete(@PathVariable Long id) {
        assetSupplyChainService.deleteByAssetIds(id);
        assetBasicNetworkService.deleteByAssetIds(id);
        assetBusinessFormService.deleteByAssetIds(id);
        unitOtherConcatService.deleteByAssetIds(id);
        assetCurrentService.deleteByUnitIds(id);

        QueryWrapper<AssetCurrentCpPo> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("id", id);
        assetCurrentCpService.remove(queryWrapper1);
        QueryWrapper<AssetSupplyChainCpPo> queryWrapper2 = new QueryWrapper<>();
        queryWrapper2.eq("asset_id", id);
        assetSupplyChainCpService.remove(queryWrapper2);
        QueryWrapper<AssetBasicNetworkCpPo> queryWrapper3 = new QueryWrapper<>();
        queryWrapper3.eq("asset_id", id);
        assetBasicNetworkCpService.remove(queryWrapper3);
        QueryWrapper<AssetBusinessFormCpPo> queryWrapper4 = new QueryWrapper<>();
        queryWrapper4.eq("asset_id", id);
        assetBusinessFormCpService.remove(queryWrapper4);
        QueryWrapper<UnitOtherConcatCpPo> queryWrapper5 = new QueryWrapper<>();
        queryWrapper5.eq("asset_id", id);
        unitOtherConcatCpService.remove(queryWrapper5);


        return success();
    }

    /**
     * 下载资产导入模板
     */
    @ApiOperation(value = "下载资产导入模板")
    @PostMapping("/importTemplate")
    public void importTemplate(HttpServletResponse response) {
        ExcelUtil<AssetExport> util = new ExcelUtil<>(AssetExport.class);
        util.importTemplateExcel(response, "资产导入模板");
    }


    /**
     * 导出现有资产
     */
    @ApiOperation(value = "导出现有资产")
    @PostMapping("/export")
    public void exportProject(HttpServletResponse response, AssetCurrentPageRequest as) {
        try {
            if (!SecurityUtils.getLoginUser().getUser().isAdmin() && !SecurityUtils.hasRole("common")) {
                as.setDwmc(SecurityUtils.getLoginUser().getUser().getNickName());
            }
        } catch (Exception e) {
            throw new ServiceException("获取用户信息异常");
        }
        List<AssetExport> list = assetCurrentService.page1(as);
        ExcelUtil<AssetExport> util = new ExcelUtil<>(AssetExport.class);
        util.exportExcel(response, list, "现有资产记录");
    }

    /**
     * 导入现有资产
     */
    @Transactional(rollbackFor = Exception.class)
    @PreAuthorize("@ss.hasAnyRoles('admin,common')")
    @ApiOperation(value = "导入现有资产")
    @PostMapping(value = "/import", consumes = "multipart/form-data")
    public AjaxResult export(@RequestPart("file") MultipartFile file) throws Exception {
        //读取所有的字段
        ExcelUtil<AssetExport> util = new ExcelUtil<>(AssetExport.class);
        List<AssetExport> proList = util.importExcel(file.getInputStream());
        for (AssetExport items : proList) {
            AssetCurrent as = new AssetCurrent();
            //copy新增到新的现有资产表里面
            BeanUtil.copyProperties(items, as);
            AssetCurrent one = assetCurrentService.lambdaQuery().eq(AssetCurrent::getXtmc, as.getXtmc())
                    .eq(AssetCurrent::getDwmc, as.getDwmc()).one();
            if (one != null) {
                as.setId(one.getId());
                assetCurrentService.updateById(as);
                List<Long> a1 = new ArrayList<>();
                a1.add(one.getId());
                assetSupplyChainService.deleteIdList(a1);
                assetBasicNetworkService.deleteIdList(a1);
            } else {
                assetCurrentService.save(as);
            }

            //新增系统建设单位
            AssetSupplyChain s1 = new AssetSupplyChain();
            BeanUtil.copyProperties(items, s1);
            s1.setType(5);
            s1.setAssetId(as.getId());
            assetSupplyChainService.save(s1);
            //新增系统运营单位
            AssetSupplyChain b6 = new AssetSupplyChain();
            b6.setGyszcdz(items.getGyszcdz1());
            b6.setLxr(items.getLxr1());
            b6.setLxdh(items.getLxdh1());
            b6.setSfwtc(items.getSfwtc1());
            b6.setName(items.getName1());
            b6.setTyshxydm(items.getTyshxydm1());
            b6.setType(7);
            b6.setAssetId(as.getId());
            assetSupplyChainService.save(b6);
            //新增服务器信息
            AssetBasicNetwork a1 = new AssetBasicNetwork();
            BeanUtil.copyProperties(items, a1);
            a1.setType(1);
            a1.setAssetId(as.getId());
            assetBasicNetworkService.save(a1);
            //新增网络设备
            AssetBasicNetwork a2 = new AssetBasicNetwork();
            a2.setSblx(items.getWlsblx());
            a2.setPp(items.getWlpp());
            a2.setSbIp(items.getWlsbIp());
            a2.setYjxh(items.getWlyjxh());
            a2.setYjxlh(items.getWlyjxlh());
            a2.setYjbbxx(items.getWlyjbbxx());
            a2.setYjyt(items.getWlyjyt());
            a2.setYjbsxx(items.getWlyjbsxx());
            a2.setType(2);
            a2.setAssetId(as.getId());
            assetBasicNetworkService.save(a2);
            //新增安全设备
            AssetBasicNetwork a3 = new AssetBasicNetwork();
            a3.setSblx(items.getAqwlsblx());
            a3.setPp(items.getAqwlpp());
            a3.setSbIp(items.getAqwlsbIp());
            a3.setType(3);
            a3.setAssetId(as.getId());
            assetBasicNetworkService.save(a3);

            //=============
            Long id = as.getId();
            Integer i = unitService.selectTaskId(as.getDwmc(), "0");
            if (i != null) {
                //新增资产复制主表
                AssetCurrentCpPo assetCurrentCpPo = new AssetCurrentCpPo();
                BeanUtil.copyProperties(as, assetCurrentCpPo);
                assetCurrentCpPo.setTaskId(i);
                AssetCurrentCpPo two = assetCurrentCpService.lambdaQuery().eq(AssetCurrentCpPo::getXtmc, as.getXtmc())
                        .eq(AssetCurrentCpPo::getDwmc, as.getDwmc()).one();
                if (two != null) {
                    assetCurrentCpPo.setId(two.getId());
                    assetCurrentCpService.updateById(assetCurrentCpPo);
                    assetSupplyChainCpService.deletByAssetIdandTaskId(id, i);
                    assetBasicNetworkCpService.deletByAssetIdandTaskId(id, i);
                } else {
                    assetCurrentCpService.save(assetCurrentCpPo);
                }
                //新增系统建设单位
                AssetSupplyChainCpPo co1 = new AssetSupplyChainCpPo();
                BeanUtil.copyProperties(items, co1);
                co1.setType(5);
                co1.setAssetId(id);
                co1.setTaskId(i);
                assetSupplyChainCpService.save(co1);

                //新增系统运营单位
                AssetSupplyChainCpPo co2 = new AssetSupplyChainCpPo();
                co2.setGyszcdz(items.getGyszcdz1());
                co2.setLxr(items.getLxr1());
                co2.setLxdh(items.getLxdh1());
                co2.setSfwtc(items.getSfwtc1());
                co2.setName(items.getName1());
                co2.setTyshxydm(items.getTyshxydm1());
                co2.setType(7);
                co2.setAssetId(as.getId());
                co2.setTaskId(i);
                assetSupplyChainCpService.save(co2);

                //新增服务器信息
                AssetBasicNetworkCpPo co3 = new AssetBasicNetworkCpPo();
                BeanUtil.copyProperties(items, co3);
                co3.setType(1);
                co3.setAssetId(id);
                co3.setTaskId(i);
                assetBasicNetworkCpService.save(co3);

                //新增网络设备
                AssetBasicNetworkCpPo co4 = new AssetBasicNetworkCpPo();
                co4.setSblx(items.getWlsblx());
                co4.setPp(items.getWlpp());
                co4.setSbIp(items.getWlsbIp());
                co4.setYjxh(items.getWlyjxh());
                co4.setYjxlh(items.getWlyjxlh());
                co4.setYjbbxx(items.getWlyjbbxx());
                co4.setYjyt(items.getWlyjyt());
                co4.setYjbsxx(items.getWlyjbsxx());
                co4.setType(2);
                co4.setAssetId(id);
                co4.setTaskId(i);
                assetBasicNetworkCpService.save(co4);
                //新增安全设备
                AssetBasicNetworkCpPo co5 = new AssetBasicNetworkCpPo();
                co5.setSblx(items.getAqwlsblx());
                co5.setPp(items.getAqwlpp());
                co5.setSbIp(items.getAqwlsbIp());
                co5.setType(3);
                co5.setAssetId(id);
                co5.setTaskId(i);
                assetBasicNetworkCpService.save(co5);

            }
        }
        return AjaxResult.success();
    }

}

