// /**
//  * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
//  * <p>
//  * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; you may not use this file except in compliance with the
//  * License. You may obtain a copy of the License at
//  * <p>
//  * http://www.gnu.org/licenses/lgpl.html
//  * <p>
//  * 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.xiaoniu.subsystem.business.controller;
//
// import com.alibaba.nacos.common.utils.CollectionUtils;
// import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
// import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
// import com.baomidou.mybatisplus.core.metadata.IPage;
// import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
// import com.xiaoniu.common.core.constant.Constants;
// import com.xiaoniu.common.core.result.R;
// import com.xiaoniu.common.core.utils.BeanUtil;
// import com.xiaoniu.common.core.utils.poi.ExcelUtil;
// import com.xiaoniu.common.log.annotation.Log;
// import com.xiaoniu.common.log.enums.BusinessType;
// import com.xiaoniu.subsystem.business.domain.Demand;
// import com.xiaoniu.subsystem.business.domain.Project;
// import com.xiaoniu.subsystem.business.domain.WaitDone;
// import com.xiaoniu.subsystem.business.domain.dto.DemandDTO;
// import com.xiaoniu.subsystem.business.domain.dto.DemandPageDTO;
// import com.xiaoniu.subsystem.business.domain.vo.DemandAuditVO;
// import com.xiaoniu.subsystem.business.domain.vo.DemandHeadVO;
// import com.xiaoniu.subsystem.business.domain.vo.DemandVO;
// import com.xiaoniu.subsystem.business.service.IDemandService;
// import com.xiaoniu.subsystem.business.service.IWaitDoneService;
// import com.xiaoniu.subsystem.system.domain.Unit;
// import com.xiaoniu.subsystem.system.service.IUnitService;
// import io.swagger.v3.oas.annotations.Operation;
// import io.swagger.v3.oas.annotations.Parameter;
// import io.swagger.v3.oas.annotations.tags.Tag;
// import jakarta.servlet.http.HttpServletResponse;
// import jakarta.validation.Valid;
// import lombok.AllArgsConstructor;
// import lombok.extern.log4j.Log4j;
// import lombok.extern.slf4j.Slf4j;
// import org.apache.commons.lang3.StringUtils;
// import org.springframework.validation.annotation.Validated;
// import org.springframework.web.bind.annotation.*;
// import org.springframework.web.multipart.MultipartFile;
//
// import java.util.*;
// import java.util.stream.Collectors;
// import java.util.stream.Stream;
//
// import static com.xiaoniu.common.security.utils.SecurityUtils.getUnitId;
// import static com.xiaoniu.common.security.utils.SecurityUtils.getUserId;
//
// /**
//  * 培训需求管理表 控制器
//  *
//  * @author sst
//  * @since 2024-11-27
//  */
// @Slf4j
// @RestController
// @AllArgsConstructor
// @RequestMapping("/demand/organ")
// @Tag(name = "培训需求管理(机关)", description = "培训需求管理(机关)接口")
// public class DemandOrganController {
//
//     private final IWaitDoneService waitDoneService;
//     private IDemandService demandService;
//     private IUnitService unitService;
//
//     /**
//      * 详情
//      */
//     @GetMapping("/detail")
//     @ApiOperationSupport(order = 1)
//     @Operation(summary = "详情", description = "传入demand")
//     public R<DemandVO> detail(@Parameter(description = "主键", required = true) @RequestParam Long demandId) {
//         Demand detail = demandService.getById(demandId);
//         return R.data(BeanUtil.copy(detail, DemandVO.class));
//     }
//
//     /**
//      * 分页 培训需求管理表
//      */
//     @GetMapping("/list")
//     @ApiOperationSupport(order = 2)
//     @Operation(summary = "分页列表", description = "传入demand")
//     public R<DemandHeadVO> list(@Validated DemandPageDTO dto) {
//         log.info("培训需求管理(机关)获取登录用户单位：{},用户ID：{}",getUnitId(),getUserId());
//         return R.data(demandService.selectDemandList(dto));
//     }
//
//     /**
//      * 导出
//      */
//     @GetMapping("/export")
//     @ApiOperationSupport(order = 3)
//     @Log(title = "需求导出", businessType = BusinessType.EXPORT)
//     @Operation(summary = "导出", description = "传入ids")
//     public void export(HttpServletResponse response,@Validated DemandPageDTO dto) {
//         List<Demand> list = new ArrayList<>();
//         if (StringUtils.isNotBlank(dto.getIds())){
//             list.addAll(demandService.list(new LambdaQueryWrapper<Demand>()
//                     .orderByDesc(Demand::getCreateTime)
//                     .in(StringUtils.isNotBlank(dto.getIds()), Demand::getDemandId,
//                             Arrays.stream(dto.getIds().split(",")).toList())));
//         }else {
//             list.addAll(demandService.list(new LambdaQueryWrapper<Demand>()
//                 .orderByDesc(Demand::getCreateTime)
//                 .eq(Demand::getParentId, 0)
//                 .eq(Demand::getCreateDept, getUnitId())
//                 .eq(null != dto.getFlightId(),
//                         Demand::getFlightId, dto.getFlightId())
//                 .like(StringUtils.isNotBlank(dto.getFlightName()),
//                         Demand::getFlightName, dto.getFlightName())
//                 .eq(null != dto.getTrainingUnitId(),
//                         Demand::getTrainingUnitId, dto.getTrainingUnitId())
//                 .like(StringUtils.isNotBlank(dto.getTrainingUnitName()),
//                         Demand::getTrainingUnitName, dto.getTrainingUnitName())
//                 .eq(StringUtils.isNotBlank(dto.getTrainingType()),
//                         Demand::getTrainingType, dto.getTrainingType())
//                 .like(StringUtils.isNotBlank(dto.getContactPerson()),
//                         Demand::getContactPerson, dto.getContactPerson())));
//         }
//         ExcelUtil<Demand> excelUtil = new ExcelUtil<>(Demand.class);
//         excelUtil.exportExcel(response, list, "需求数据");
//
//     }
//
//     /**
//      * 保存下发
//      */
//     @PostMapping("/save/issue")
//     @ApiOperationSupport(order = 4)
//     @Operation(summary = "保存（未下发isIssue=0 下发isIssue=1）", description = "传入demand")
//     public R saveIssue(@Valid @RequestBody DemandDTO dto) {
//         if (null == dto.getDemandId()){
//             demandService.save(dto.setIsReport("1")
//                     .setCreateDept(getUnitId()).setCreateUser(getUserId()).setCreateTime(new Date()));
//         }else {
//             Demand demand = demandService.getById(dto.getDemandId());
//             if (demand == null) {
//                 return R.fail("数据不存在");
//             }
//             demandService.updateById(dto
//                     .setUpdateUser(getUserId()).setUpdateTime(new Date()));
//         }
//         if (StringUtils.isNotBlank(dto.getIsIssue()) && StringUtils.equals("1",dto.getIsIssue())){
//             demandService.saveBatch(Stream.of(dto.getUnitIds().split(","))
//                     .map(l -> Objects.requireNonNull(BeanUtil.copy(dto, Demand.class))
//                             .setDemandId(null).setIsReport("0").setIsIssue("0")
//                             .setParentId(dto.getDemandId()).setUnitIds("")
//                             .setUnitNames("").setCreateDept(Long.valueOf(l)))
//                     .toList());
//             demandService.updateById(dto.setIsIssue("1")
//                     .setUpdateUser(getUserId()).setUpdateTime(new Date()));
//             return R.status(waitDoneService.saveBatch(Stream.of(dto.getUnitIds().split(","))
//                     .map(l -> new WaitDone().setWaitDoneUnit(Long.valueOf(l))
//                             .setFlightId(dto.getFlightId())
//                             .setFlightName(dto.getFlightName())
//                             .setType("0")
//                             .setWaitDoneMessage("需求下发待办提示,点击跳转需求类表（部队）并修改状态")
//                             .setSkip("")
//                             .setBusinessId(dto.getDemandId())
//                             .setCreateDept(getUnitId())
//                             .setIsDeleted(Constants.ZERO)
//                             .setStatus(Constants.ZERO)
//                     ).collect(Collectors.toList())));
//         }
//         return R.status(true);
//     }
//
//     /**
//      * 修改 培训需求管理表
//      */
//     @PostMapping("/update")
//     @ApiOperationSupport(order = 5)
//     @Operation(summary = "修改", description = "传入demand")
//     public R update(@Valid @RequestBody DemandDTO dto) {
//         demandService.updateById(dto.setUpdateUser(getUserId()).setUpdateTime(new Date()));
//         List<Demand> list =
//             demandService.list(new LambdaQueryWrapper<Demand>().eq(Demand::getParentId, dto.getDemandId()));
//         if (CollectionUtils.isEmpty(list)) {
//             return R.status(true);
//         }
//         dto.setDemandId(null);
//         List<Demand> demandList = new ArrayList<Demand>();
//         list.forEach(l ->
//                 demandList.add(BeanUtil.copy(dto, Demand.class)
//                     .setDemandId(l.getDemandId()).setParentId(dto.getDemandId())
//                     .setUnitIds(l.getUnitIds()).setUnitNames(l.getUnitNames())
//                     .setCreateUser(l.getCreateUser()).setIsIssue(l.getIsIssue())
//                     .setIsReport(l.getIsReport()).setStatus(l.getStatus())
//                     .setCreateTime(l.getCreateTime()).setRemark(l.getRemark())
//                     .setReason(l.getReason()).setCreateDept(l.getCreateDept())));
//         return R.status(demandService.updateBatchById(demandList));
//     }
//
//     // /**
//     // * 新增或修改 培训需求管理表
//     // */
//     // @PostMapping("/submit")
//     // @ApiOperationSupport(order = 6)
//     // @Operation(summary = "新增或修改", description = "传入demand")
//     // public R submit(@Valid @RequestBody DemandDTO demand) {
//     // return R.status(demandService.saveOrUpdate(demand));
//     // }
//
//     /**
//      * 删除 培训需求管理表
//      */
//     @PostMapping("/remove")
//     @ApiOperationSupport(order = 7)
//     @Operation(summary = "删除", description = "传入ids")
//     public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String demandIds) {
//         return R.status(demandService.removeByIds(Arrays.stream(demandIds.split(",")).toList()));
//     }
//
//     @PostMapping("/import")
//     @ApiOperationSupport(order = 8)
//     @Log(title = "培训需求导入", businessType = BusinessType.IMPORT)
//     @Operation(summary = "导入")
//     public R importData(MultipartFile file,
//                         @Parameter(description = "是否支持更新", required = true)
//                         @RequestParam boolean updateSupport) throws Exception {
//         ExcelUtil<Demand> util = new ExcelUtil<>(Demand.class);
//         List<Demand> list = util.importExcel(file.getInputStream());
//         return R.success(demandService.importData(list, updateSupport));
//     }
//
//     @GetMapping("/importTemplate")
//     @ApiOperationSupport(order = 9)
//     @Operation(summary = "导入模版下载")
//     public void importTemplate(HttpServletResponse response) {
//         ExcelUtil<Demand> util = new ExcelUtil<>(Demand.class);
//         util.importTemplateExcel(response, "培训需求导入模版");
//     }
//
//     /**
//      * 审核列表
//      */
//     @GetMapping("/audit/list")
//     @ApiOperationSupport(order = 10)
//     @Operation(summary = "审核列表", description = "传入demand")
//     public R<List<DemandAuditVO>> auditList() {
//         List<Unit> units = unitService.list(new LambdaQueryWrapper<Unit>().eq(Unit::getParentId, getUnitId()));
//         if (CollectionUtils.isEmpty(units)){
//             return R.data(Collections.emptyList());
//         }
//         Map<Long, String> map = units.stream().collect(Collectors.toMap(Unit::getUnitId, Unit::getUnitName));
//         List<Demand> list = demandService.list(new LambdaQueryWrapper<Demand>()
//                 .ne(Demand::getParentId, 0)
//                 .eq(Demand::getIsReport, "1").in(Demand::getCreateDept, map.keySet()));
//         return R.data(list.stream().map(l -> {
//             DemandAuditVO demandAuditVO = new DemandAuditVO();
//             demandAuditVO.setUnitId(l.getCreateDept());
//             demandAuditVO.setUnitName(map.get(l.getCreateDept()));
//             demandAuditVO.setStatus(l.getStatus());
//             demandAuditVO.setDemand(l);
//             return demandAuditVO;
//         }).collect(Collectors.toList()));
//     }
//
//     /**
//      * 审核
//      */
//     @PostMapping("/audit")
//     @ApiOperationSupport(order = 11)
//     @Operation(summary = "审核", description = "传入demand")
//     public R audit(@Valid @RequestBody DemandDTO demand) {
//         demandService.updateById(demand);
//         Demand byId = demandService.getById(demand.getDemandId());
//         WaitDone one = waitDoneService.getOne(new LambdaQueryWrapper<WaitDone>()
//                 .eq(WaitDone::getBusinessId, byId.getDemandId())
//                 .eq(WaitDone::getType, "1")
//                 .eq(WaitDone::getCreateDept, byId.getCreateDept()));
//         if (null != one){
//             waitDoneService.updateById(one.setStatus(1));
//         }
//         return R.status(waitDoneService.save(new WaitDone()
//                 .setWaitDoneUnit(byId.getCreateDept())
//                 .setFlightId(byId.getFlightId())
//                 .setFlightName(byId.getFlightName())
//                 .setType("5")
//                 .setWaitDoneMessage("需求下发审核待办提示,点击跳转需求（部队列表）并修改状态")
//                 .setSkip("")
//                 .setBusinessId(byId.getDemandId())
//                 .setCreateDept(getUnitId())
//                 .setIsDeleted(Constants.ZERO)
//                 .setStatus(Constants.ZERO)));
//     }
//
//     // /**
//     //  * 保存草稿
//     //  */
//     // @PostMapping("/save/draft")
//     // @ApiOperationSupport(order = 12)
//     // @Operation(summary = "保存草稿", description = "传入demand")
//     // public R saveDraft(@Valid @RequestBody DemandDTO dto) {
//     //     return R.status(demandService.save(dto.setIsDraft(1)
//     //             .setCreateDept(getUnitId()).setCreateUser(getUserId()).setCreateTime(new Date())));
//     // }
// }
