MaterialController.java 10.6 KB
package com.huaheng.pc.config.material.controller;

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.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.utils.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.poi.ExcelUtil;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.aspectj.lang.annotation.Log;
import com.huaheng.framework.aspectj.lang.constant.BusinessType;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.page.PageDomain;
import com.huaheng.framework.web.page.TableDataInfo;
import com.huaheng.framework.web.page.TableSupport;
import com.huaheng.pc.common.JasperPrint.Print;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
import com.huaheng.pc.config.materialArea.domain.MaterialArea;
import com.huaheng.pc.config.materialArea.service.MaterialAreaService;
import com.huaheng.pc.inventory.inventoryDetail.domain.InventoryDetail;
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.*;

@Api(tags = {"物料控制类"})
@Controller
@RequestMapping("/config/material")
public class  MaterialController extends BaseController {

  private String prefix = "config/material";

  @Resource
  private MaterialService materialService;
  @Resource
  private MaterialAreaService materialAreaService;
  @Resource
  private InventoryDetailService inventoryDetailService;
  @Resource
  private DataSource dataSource;
  @Resource
  private Print print;

  @RequiresPermissions("config:material:view")
  @GetMapping()
  public String material () {
    return prefix + "/material";
  }


  @GetMapping("materialSelect")
  public String materialSelect () {
    return "config/material/materialSelect.html";
  }

  /**
   * 查询物料列表
   */
  @ApiOperation(value = "查看物料列表",
          notes = "根据物料编码、名称、规格、物料类别、创建时间获取物料的详细信息",
          httpMethod = "POST")
  @RequiresPermissions("config:material:list")
  @Log(title = "通用-物料管理", operating = "查看物料列表", action = BusinessType.GRANT)
  @PostMapping("/list")
  @ResponseBody
  public TableDataInfo list (
          @ApiParam(name = "location", value = "物料编码、名称、规格、物料类别") Material material,
          @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin,
          @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd) {

    PageDomain pageDomain = TableSupport.buildPageRequest();
    Integer pageNum = pageDomain.getPageNum();
    Integer pageSize = pageDomain.getPageSize();
    LambdaQueryWrapper<Material> lambda = Wrappers.lambdaQuery();
    lambda.gt(StringUtils.isNotEmpty(createdBegin), Material::getCreated, createdBegin)
            .lt(StringUtils.isNotEmpty(createdEnd), Material::getCreated, createdEnd)
            .eq(StringUtils.isNotNull(material.getCode()) && StringUtils.isNotEmpty(material.getCode()), Material::getCode, material.getCode())
            .like(StringUtils.isNotNull(material.getName()) && StringUtils.isNotEmpty(material.getName()), Material::getName, material.getName())
            .eq(StringUtils.isNotEmpty(material.getType()), Material::getType, material.getType())
            .like(StringUtils.isNotNull(material.getSpec()) && StringUtils.isNotEmpty(material.getSpec()), Material::getSpec, material.getSpec())
            .eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode())
            .eq(Material::getDeleted, false);

    if(StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
      /*使用分页查询*/
      Page<Material> page = new Page<>(pageNum, pageSize);
      IPage<Material> iPage = materialService.page(page, lambda);
      return getMpDataTable(iPage.getRecords(), iPage.getTotal());
    } else {
      List<Material> list = materialService.list(lambda);
      return getDataTable(list);
    }
  }

  /**
   * 新增物料
   */
  @GetMapping("/add")
  public String add () {
    return prefix + "/add";
  }

  /**
   * 新增保存物料
   */
  @ApiOperation(value = "新增物料", notes = "新增物料", httpMethod = "POST")
  @RequiresPermissions("config:material:add")
  @Log(title = "通用-物料管理", operating = "新增物料", action = BusinessType.INSERT)
  @PostMapping("/add")
  @ResponseBody
  public AjaxResult addSave (Material material) {

    return materialService.addSave(material);
  }

  /**
   * 修改物料
   */
  @GetMapping("/edit/{id}")
  public String edit (@PathVariable("id") Integer id, ModelMap mmap) {
    Material material = materialService.getById(id);
    mmap.put("material", material);
    return prefix + "/edit";
  }

  /**
   * 修改保存物料
   */
  @ApiOperation(value = "修改物料", notes = "修改物料", httpMethod = "POST")
  @RequiresPermissions("config:material:edit")
  @Log(title = "通用-物料管理", operating = "修改物料", action = BusinessType.UPDATE)
  @PostMapping("/edit")
  @ResponseBody
  public AjaxResult editSave (Material material) {
    material.setLastUpdatedBy(ShiroUtils.getLoginName());

    return toAjax(materialService.updateById(material));
  }

  /**
   * 修改物料
   */
  @GetMapping("/editBatch/{ids}")
  public String editBatch (@PathVariable("ids") String ids, ModelMap mmap) {
    mmap.put("ids", ids);
    return prefix + "/editBatch";
  }

  /**
   * 修改保存物料
   */
  @ApiOperation(value = "批量修改物料", notes = "批量修改物料", httpMethod = "POST")
  @RequiresPermissions("config:material:edit")
  @Log(title = "基础数据-物料管理", operating = "批量修改物料", action = BusinessType.UPDATE)
  @PostMapping("/editBatchSave")
  @ResponseBody
  public AjaxResult editBatchSave (String ids, String materialAreaCode) {
      if(StringUtils.isNotEmpty(materialAreaCode)) {
        LambdaQueryWrapper<MaterialArea> materialAreaLambdaQueryWrapper = Wrappers.lambdaQuery();
        materialAreaLambdaQueryWrapper.eq(MaterialArea::getCode, materialAreaCode);
        MaterialArea materialArea = materialAreaService.getOne(materialAreaLambdaQueryWrapper);
        if (materialArea == null) {
          return AjaxResult.error("没找到对应的物料区域");
        }
      }
      String[] idArray = Convert.toStrArray(ids);
      LambdaUpdateWrapper<Material> wrapper = Wrappers.lambdaUpdate();
      wrapper.in(Material::getId, idArray)
              .set(Material::getMaterialAreaCode, materialAreaCode);
      return toAjax(materialService.update(wrapper));
  }

  /**
   * 删除物料
   */
  @RequiresPermissions("config:material:remove")
  @Log(title = "通用-物料管理", operating = "删除物料", action = BusinessType.DELETE)
  @PostMapping("/remove")
  @ResponseBody
  public AjaxResult remove (String ids) {
    if(StringUtils.isEmpty(ids)) {
      return AjaxResult.error("id不能为空");
    } else {
      for (Integer id : Convert.toIntArray(ids)) {
        Material material = materialService.getById(id);
        LambdaQueryWrapper<InventoryDetail> lamb = Wrappers.lambdaQuery();
        lamb.eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode())
                .eq(InventoryDetail::getMaterialCode, material.getCode());
        List<InventoryDetail> inventoryDetails = inventoryDetailService.list(lamb);
        if(!inventoryDetails.isEmpty()) {
          throw new ServiceException("id为" + id + "的物料有库存");
        }
      }
      return materialService.removeByIds(ids);
    }
  }


  @PostMapping("/importData")
  @ResponseBody
  public AjaxResult importData (MultipartFile file) throws Exception {
    ExcelUtil<Material> util = new ExcelUtil<>(Material.class);
    List<Material> materialList = util.importExcel(file.getInputStream());
    String operName = ShiroUtils.getLoginName();
    String message = materialService.importMaterial(materialList, false, operName);
    return AjaxResult.success(message);
  }

  /**
   * 导出模板
   *
   * @return
   * @throws Exception
   */
  @GetMapping("/importTemplate")
  @ResponseBody
  public AjaxResult importTemplate () {
    ExcelUtil<Material> util = new ExcelUtil<>(Material.class);
    return util.importTemplateExcel("物料");
  }

  @RequiresPermissions("config:material:print")
  @Log(title = "库存-库存交易明细", operating = "库存交易明细报表打印", action = BusinessType.OTHER)
  @GetMapping("/print/{ids}")
  public void print (@PathVariable("ids") Integer[] ids, ModelMap mmap)  // arg1:物料id arg2:会话对象不需要直接返回
  {
    print.jasperPrint(ids, prefix);// 不用返回json打印
  }

  @PostMapping("/getData")
  @ResponseBody // 这个是物料编码list要增加表单提交获取的
  public Map<String, Object> getData (String materialName, String materialCode) { // 新增表单是没有物料名和物料编码
    LambdaQueryWrapper<Material> queryWrapper = Wrappers.lambdaQuery();
    queryWrapper.like(StringUtils.isNotEmpty(materialName), Material::getCode, materialName) //  WHERE material =
            .or() // sql语句拼接or
            .like(StringUtils.isNotEmpty(materialName), Material::getName, materialName);
    queryWrapper.eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode()).ne(Material::getDeleted,1)
            .last("LIMIT 100");
    List<Material> materialList = materialService.list(queryWrapper);

    List<Map<String, Object>> list = new ArrayList<>();
    for (Material material : materialList) {
      Map<String, Object> resultMap = new HashMap<>();
      if(StringUtils.isNotEmpty(materialCode) && material.getCode().equals(materialCode)) {
        resultMap.put("selected", true);
      }
      resultMap.put("id", material.getCode());
      resultMap.put("text", material.getName());
      list.add(resultMap);
    }
    Map<String, Object> map = new HashMap<>();
    map.put("results", list);
    return map; // 不返回页面只返回数据
  }

}