package org.jeecg.modules.payment.controller;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.dto.payment.ProjectArchiveReqDTO;
import org.jeecg.common.dto.payment.ProjectArchiveRespDTO;
import org.jeecg.common.dto.payment.SlieReqDTO;
import org.jeecg.common.dto.payment.SlipAddReqDTO;
import org.jeecg.common.dto.payment.SlipRespDTO;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.modules.payment.entity.ManagerPaymentAndReceiptSlip;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.payment.service.ManagerPaymentAndReceiptSlipService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
   * @Author jihaosen
   * @date 2021/3/3
   */
@Api("收付款管理--收付款单")
@RestController
@RequestMapping("/payment/managerPaymentAndReceiptSlip")
@Slf4j
public class ManagerPaymentAndReceiptSlipController {
	@Autowired
	private ManagerPaymentAndReceiptSlipService managerPaymentAndReceiptSlipService;

	 @ApiOperation(value = "分页查询接口", notes = "分页查询收付款单")
	 @ApiImplicitParams({
			 @ApiImplicitParam(name = "pkOrg", value = "组织", required = true, dataType = "String")
	 })
	@GetMapping(value = "/list")
	public Result<IPage<ManagerPaymentAndReceiptSlip>> queryPageList(@Valid ManagerPaymentAndReceiptSlip managerPaymentAndReceiptSlip,
		  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
		  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
		  HttpServletRequest req) {
		Result<IPage<ManagerPaymentAndReceiptSlip>> result = new Result<IPage<ManagerPaymentAndReceiptSlip>>();
		 managerPaymentAndReceiptSlip.setDelFlag(null);
		QueryWrapper<ManagerPaymentAndReceiptSlip> queryWrapper = QueryGenerator.initQueryWrapper(managerPaymentAndReceiptSlip, req.getParameterMap());
		Page<ManagerPaymentAndReceiptSlip> page = new Page<ManagerPaymentAndReceiptSlip>(pageNo, pageSize);
		 queryWrapper.eq("del_flag", "0");
		 queryWrapper.orderByDesc("create_time");
		IPage<ManagerPaymentAndReceiptSlip> pageList = managerPaymentAndReceiptSlipService.page(page, queryWrapper);
		result.setSuccess(true);
		result.setResult(pageList);
		return result;
	}

	 @ApiOperation(value = "新增", notes = "新增收付款单")
	 @ApiImplicitParams({
			 @ApiImplicitParam(name = "proId", value = "项目id", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "proName", value = "项目名称", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "proCode", value = "项目编码", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "cusId", value = "客户档案id", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "cusCode", value = "客户档案编码", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "cusName", value = "客户档案名称", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "pkOrg", value = "组织", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "proArchivesId", value = "项目档案id", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "proArchivesMilestone", value = "项目档案--里程碑", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "coArchivesId", value = "收款条线档案id", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "coArchivesName", value = "收付款条线档案名称", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "coPrvice", value = "收款金额", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "explain", value = "说明", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "invoice", value = "对应发票(采购发票)", required = true, dataType = "String"),
	 })
	@PostMapping(value = "/add")
	public Result<ManagerPaymentAndReceiptSlip> add(@RequestBody SlipAddReqDTO reqDTO, BindingResult bindingResult) {
		Result<ManagerPaymentAndReceiptSlip> result = new Result<ManagerPaymentAndReceiptSlip>();
		try {
			StringBuilder sb = new StringBuilder();
			if (bindingResult.hasErrors()){
				//记录错误信息
				bindingResult.getAllErrors().stream().forEach(error -> sb.append(error.getDefaultMessage() + "<br/>"));
				result.error500(sb.toString());
				return result;
			}
			if(CollectionUtils.isEmpty(reqDTO.getDetailList())){
				throw new JeecgBootException("子表数据不能为空");
			}
			managerPaymentAndReceiptSlipService.add(reqDTO);
			result.success("添加成功!");
		} catch (Exception e) {
			e.printStackTrace();
			log.info(e.getMessage());
			result.error500("操作失败");
		}
		return result;
	}

	 @ApiOperation(value = "编辑", notes = "编辑收款单")
	 @ApiImplicitParams({
			 @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "proId", value = "项目id", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "proName", value = "项目名称", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "proCode", value = "项目编码", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "cusId", value = "客户档案id", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "cusCode", value = "客户档案编码", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "cusName", value = "客户档案名称", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "pkOrg", value = "组织", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "proArchivesId", value = "项目档案id", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "proArchivesMilestone", value = "项目档案--里程碑", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "coArchivesId", value = "收款条线档案id", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "coArchivesName", value = "收付款条线档案名称", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "coPrvice", value = "收款金额", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "explain", value = "说明", required = true, dataType = "String"),
			 @ApiImplicitParam(name = "invoice", value = "对应发票(采购发票)", required = true, dataType = "String"),
	 })
	@PutMapping(value = "/edit")
	public Result<ManagerPaymentAndReceiptSlip> edit(@RequestBody SlipAddReqDTO reqDTO) {
		Result<ManagerPaymentAndReceiptSlip> result = new Result<ManagerPaymentAndReceiptSlip>();
		ManagerPaymentAndReceiptSlip managerPaymentAndReceiptSlipEntity = managerPaymentAndReceiptSlipService.getById(reqDTO.getId());
		if(managerPaymentAndReceiptSlipEntity==null) {
			result.error500("未找到对应实体");
		}else {
			if(CollectionUtils.isEmpty(reqDTO.getDetailList())){
				throw new JeecgBootException("子表数据不能为空");
			}
			boolean ok = managerPaymentAndReceiptSlipService.edit(reqDTO);
			if(ok) {
				result.success("修改成功!");
			}
		}
		
		return result;
	}
	
	@ApiOperation(value = "通过id删除", notes = "通过id删除收付款单")
	@ApiImplicitParams({
			@ApiImplicitParam(name = "id", value = "id", required = true, dataType = "String"),
	})
	@DeleteMapping(value = "/delete")
	public Result<ManagerPaymentAndReceiptSlip> delete(SlieReqDTO reqDTO) {
		Result<ManagerPaymentAndReceiptSlip> result = new Result<ManagerPaymentAndReceiptSlip>();
		ManagerPaymentAndReceiptSlip managerPaymentAndReceiptSlip = managerPaymentAndReceiptSlipService.getById(reqDTO.getId());
		if(managerPaymentAndReceiptSlip==null) {
			result.error500("未找到对应实体");
		}else {
			boolean ok = managerPaymentAndReceiptSlipService.dropById(managerPaymentAndReceiptSlip);
			if(ok) {
				result.success("删除成功!");
			}
		}
		
		return result;
	}

	 @ApiOperation(value = "通过id查询", notes = "通过id查询收付款单")
	 @ApiImplicitParams({
			 @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "String"),
	 })
	@GetMapping(value = "/queryById")
	public Result<SlipRespDTO> queryById(SlieReqDTO reqDTO) {
		Result<SlipRespDTO> result = new Result<SlipRespDTO>();
		 SlipRespDTO managerPaymentAndReceiptSlip = managerPaymentAndReceiptSlipService.queryById(reqDTO.getId());
		if(managerPaymentAndReceiptSlip==null) {
			result.error500("未找到对应实体");
		}else {
			result.setResult(managerPaymentAndReceiptSlip);
			result.setSuccess(true);
		}
		return result;
	}

	@ApiOperation(value = "获取项目档案的名称与编码", notes = "过滤已经使用过得项目编码与名称")
	@GetMapping(value = "/getProNameAndCode")
	public Result<List<ProjectArchiveRespDTO>> get(ProjectArchiveReqDTO reqDTO) {
		Result<List<ProjectArchiveRespDTO>> result = new Result<List<ProjectArchiveRespDTO>>();
		List<ProjectArchiveRespDTO>  projectArchiveRespDTOS = managerPaymentAndReceiptSlipService.getProNameAndCode(reqDTO);
			result.setResult(projectArchiveRespDTOS);
			result.setSuccess(true);
		return result;
	}
}