Commit 55f87d07 by 胡懿

货品,二维码,入库,台账表生成

parent 2d68aa17
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.goods.entity;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import javax.validation.constraints.NotNull;
import com.jeeplus.modules.sys.entity.User;
import java.util.List;
import com.google.common.collect.Lists;
import com.jeeplus.core.persistence.DataEntity;
import com.jeeplus.common.utils.excel.annotation.ExcelField;
/**
* 货品模块Entity
* @author huyi
* @version 2023-02-13
*/
public class Goods extends DataEntity<Goods> {
private static final long serialVersionUID = 1L;
private String batchNum; // 批次号
private Date time; // 时间
private User operator; // 操作人
private Date beginTime; // 开始 时间
private Date endTime; // 结束 时间
private List<GoodsInfo> goodsInfoList = Lists.newArrayList(); // 子表列表
public Goods() {
super();
}
public Goods(String id){
super(id);
}
@ExcelField(title="批次号", align=2, sort=1)
public String getBatchNum() {
return batchNum;
}
public void setBatchNum(String batchNum) {
this.batchNum = batchNum;
}
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@NotNull(message="时间不能为空")
@ExcelField(title="时间", align=2, sort=2)
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
@NotNull(message="操作人不能为空")
@ExcelField(title="操作人", fieldType=User.class, value="operator.name", align=2, sort=4)
public User getOperator() {
return operator;
}
public void setOperator(User operator) {
this.operator = operator;
}
public Date getBeginTime() {
return beginTime;
}
public void setBeginTime(Date beginTime) {
this.beginTime = beginTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public List<GoodsInfo> getGoodsInfoList() {
return goodsInfoList;
}
public void setGoodsInfoList(List<GoodsInfo> goodsInfoList) {
this.goodsInfoList = goodsInfoList;
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.goods.entity;
import com.jeeplus.modules.warehouse.materialtype.entity.MaterialType;
import com.jeeplus.modules.warehouse.goods.entity.Goods;
import com.jeeplus.core.persistence.DataEntity;
import com.jeeplus.common.utils.excel.annotation.ExcelField;
/**
* 货品明细Entity
* @author huyi
* @version 2023-02-13
*/
public class GoodsInfo extends DataEntity<GoodsInfo> {
private static final long serialVersionUID = 1L;
private String name; // 名称
private MaterialType type; // 类型
private String model; // 型号
private Integer num; // 数量
private String state; // 入库状态
private Goods goods; // 主表ID 父类
public GoodsInfo() {
super();
}
public GoodsInfo(String id){
super(id);
}
public GoodsInfo(Goods goods){
this.goods = goods;
}
@ExcelField(title="名称", align=2, sort=1)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ExcelField(title="类型", fieldType=MaterialType.class, value="type.code", align=2, sort=2)
public MaterialType getType() {
return type;
}
public void setType(MaterialType type) {
this.type = type;
}
@ExcelField(title="型号", align=2, sort=3)
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
@ExcelField(title="数量", align=2, sort=4)
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
@ExcelField(title="入库状态", dictType="wh_stockroom_state", align=2, sort=6)
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Goods getGoods() {
return goods;
}
public void setGoods(Goods goods) {
this.goods = goods;
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.test.grid.mapper;
package com.jeeplus.modules.warehouse.goods.mapper;
import com.jeeplus.core.persistence.BaseMapper;
import com.jeeplus.core.persistence.annotation.MyBatisMapper;
import com.jeeplus.modules.test.grid.entity.TestCountry;
import com.jeeplus.modules.warehouse.goods.entity.GoodsInfo;
/**
* 国家MAPPER接口
* @author lgf
* @version 2018-04-10
* 货品明细MAPPER接口
* @author huyi
* @version 2023-02-13
*/
@MyBatisMapper
public interface TestCountryMapper extends BaseMapper<TestCountry> {
public interface GoodsInfoMapper extends BaseMapper<GoodsInfo> {
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.test.manytoone.mapper;
package com.jeeplus.modules.warehouse.goods.mapper;
import com.jeeplus.core.persistence.BaseMapper;
import com.jeeplus.core.persistence.annotation.MyBatisMapper;
import com.jeeplus.modules.test.manytoone.entity.Goods;
import com.jeeplus.modules.warehouse.goods.entity.Goods;
/**
* 商品MAPPER接口
* @author liugf
* @version 2018-06-12
* 货品模块MAPPER接口
* @author huyi
* @version 2023-02-13
*/
@MyBatisMapper
public interface GoodsMapper extends BaseMapper<Goods> {
......
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeeplus.modules.warehouse.goods.mapper.GoodsInfoMapper">
<sql id="goodsInfoColumns">
a.id AS "id",
a.name AS "name",
a.type_id AS "type.id",
a.model AS "model",
a.num AS "num",
a.remarks AS "remarks",
a.state AS "state",
a.goods_id AS "goods.id",
a.create_by AS "createBy.id",
a.create_date AS "createDate",
a.update_by AS "updateBy.id",
a.update_date AS "updateDate",
a.del_flag AS "delFlag",
type.code AS "type.code",
type.name AS "type.name"
</sql>
<sql id="goodsInfoJoins">
LEFT JOIN t_wh_material_type type ON type.id = a.type_id
LEFT JOIN t_wh_goods b ON b.id = a.goods_id
</sql>
<select id="get" resultType="GoodsInfo" >
SELECT
<include refid="goodsInfoColumns"/>
FROM t_wh_goods_info a
<include refid="goodsInfoJoins"/>
WHERE a.id = #{id}
</select>
<select id="findList" resultType="GoodsInfo" >
SELECT
<include refid="goodsInfoColumns"/>
FROM t_wh_goods_info a
<include refid="goodsInfoJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
<if test="name != null and name != ''">
AND a.name = #{name}
</if>
<if test="type != null and type.id != null and type.id != ''">
AND a.type_id = #{type.id}
</if>
<if test="model != null and model != ''">
AND a.model LIKE
<if test="dbName == 'oracle'">'%'||#{model}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{model}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{model},'%')</if>
</if>
<if test="state != null and state != ''">
AND a.state = #{state}
</if>
<if test="goods != null and goods.id != null and goods.id != ''">
AND a.goods_id = #{goods.id}
</if>
</where>
<choose>
<when test="page !=null and page.orderBy != null and page.orderBy != ''">
ORDER BY ${page.orderBy}
</when>
<otherwise>
ORDER BY a.create_date ASC
</otherwise>
</choose>
</select>
<select id="findAllList" resultType="GoodsInfo" >
SELECT
<include refid="goodsInfoColumns"/>
FROM t_wh_goods_info a
<include refid="goodsInfoJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
</where>
<choose>
<when test="page !=null and page.orderBy != null and page.orderBy != ''">
ORDER BY ${page.orderBy}
</when>
<otherwise>
ORDER BY a.create_date ASC
</otherwise>
</choose>
</select>
<insert id="insert">
INSERT INTO t_wh_goods_info(
id,
name,
type_id,
model,
num,
remarks,
state,
goods_id,
create_by,
create_date,
update_by,
update_date,
del_flag
) VALUES (
#{id},
#{name},
#{type.id},
#{model},
#{num},
#{remarks},
#{state},
#{goods.id},
#{createBy.id},
#{createDate},
#{updateBy.id},
#{updateDate},
#{delFlag}
)
</insert>
<update id="update">
UPDATE t_wh_goods_info SET
name = #{name},
type_id = #{type.id},
model = #{model},
num = #{num},
remarks = #{remarks},
state = #{state},
goods_id = #{goods.id},
update_by = #{updateBy.id},
update_date = #{updateDate}
WHERE id = #{id}
</update>
<!--物理删除-->
<update id="delete">
DELETE FROM t_wh_goods_info
<choose>
<when test="id !=null and id != ''">
WHERE id = #{id}
</when>
<otherwise>
WHERE goods_id = #{goods.id}
</otherwise>
</choose>
</update>
<!--逻辑删除-->
<update id="deleteByLogic">
UPDATE t_wh_goods_info SET
del_flag = #{DEL_FLAG_DELETE}
<choose>
<when test="id !=null and id != ''">
WHERE id = #{id}
</when>
<otherwise>
WHERE goods_id = #{goods.id}
</otherwise>
</choose>
</update>
<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
<select id="findUniqueByProperty" resultType="GoodsInfo" statementType="STATEMENT">
select * FROM t_wh_goods_info where ${propertyName} = '${value}'
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeeplus.modules.test.manytoone.mapper.GoodsMapper">
<mapper namespace="com.jeeplus.modules.warehouse.goods.mapper.GoodsMapper">
<sql id="goodsColumns">
a.id AS "id",
a.name AS "name",
a.category_id AS "category.id",
a.price AS "price",
a.batch_num AS "batchNum",
a.time AS "time",
a.remarks AS "remarks",
a.operator AS "operator.id",
a.create_by AS "createBy.id",
a.create_date AS "createDate",
a.update_by AS "updateBy.id",
a.update_date AS "updateDate",
a.remarks AS "remarks",
a.del_flag AS "delFlag",
category.name AS "category.name"
operator.name AS "operator.name"
</sql>
<sql id="goodsJoins">
LEFT JOIN test_category category ON category.id = a.category_id
LEFT JOIN sys_user operator ON operator.id = a.operator
</sql>
<select id="get" resultType="Goods" >
SELECT
<include refid="goodsColumns"/>
FROM test_goods a
FROM t_wh_goods a
<include refid="goodsJoins"/>
WHERE a.id = #{id}
</select>
......@@ -35,16 +37,19 @@
<select id="findList" resultType="Goods" >
SELECT
<include refid="goodsColumns"/>
FROM test_goods a
FROM t_wh_goods a
<include refid="goodsJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
<if test="name != null and name != ''">
AND a.name = #{name}
<if test="batchNum != null and batchNum != ''">
AND a.batch_num = #{batchNum}
</if>
<if test="beginTime != null and endTime != null ">
AND a.time BETWEEN #{beginTime} AND #{endTime}
</if>
<if test="category != null and category.id != null and category.id != ''">
AND a.category_id = #{category.id}
<if test="operator != null and operator.id != null and operator.id != ''">
AND a.operator = #{operator.id}
</if>
</where>
<choose>
......@@ -60,7 +65,7 @@
<select id="findAllList" resultType="Goods" >
SELECT
<include refid="goodsColumns"/>
FROM test_goods a
FROM t_wh_goods a
<include refid="goodsJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
......@@ -77,52 +82,52 @@
</select>
<insert id="insert">
INSERT INTO test_goods(
INSERT INTO t_wh_goods(
id,
name,
category_id,
price,
batch_num,
time,
remarks,
operator,
create_by,
create_date,
update_by,
update_date,
remarks,
del_flag
) VALUES (
#{id},
#{name},
#{category.id},
#{price},
#{batchNum},
#{time},
#{remarks},
#{operator.id},
#{createBy.id},
#{createDate},
#{updateBy.id},
#{updateDate},
#{remarks},
#{delFlag}
)
</insert>
<update id="update">
UPDATE test_goods SET
name = #{name},
category_id = #{category.id},
price = #{price},
UPDATE t_wh_goods SET
batch_num = #{batchNum},
time = #{time},
remarks = #{remarks},
operator = #{operator.id},
update_by = #{updateBy.id},
update_date = #{updateDate},
remarks = #{remarks}
update_date = #{updateDate}
WHERE id = #{id}
</update>
<!--物理删除-->
<update id="delete">
DELETE FROM test_goods
DELETE FROM t_wh_goods
WHERE id = #{id}
</update>
<!--逻辑删除-->
<update id="deleteByLogic">
UPDATE test_goods SET
UPDATE t_wh_goods SET
del_flag = #{DEL_FLAG_DELETE}
WHERE id = #{id}
</update>
......@@ -130,7 +135,7 @@
<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
<select id="findUniqueByProperty" resultType="Goods" statementType="STATEMENT">
select * FROM test_goods where ${propertyName} = '${value}'
select * FROM t_wh_goods where ${propertyName} = '${value}'
</select>
</mapper>
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.goods.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jeeplus.core.persistence.Page;
import com.jeeplus.core.service.CrudService;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.modules.warehouse.goods.entity.Goods;
import com.jeeplus.modules.warehouse.goods.mapper.GoodsMapper;
import com.jeeplus.modules.warehouse.goods.entity.GoodsInfo;
import com.jeeplus.modules.warehouse.goods.mapper.GoodsInfoMapper;
/**
* 货品模块Service
* @author huyi
* @version 2023-02-13
*/
@Service
@Transactional(readOnly = true)
public class GoodsService extends CrudService<GoodsMapper, Goods> {
@Autowired
private GoodsInfoMapper goodsInfoMapper;
public Goods get(String id) {
Goods goods = super.get(id);
goods.setGoodsInfoList(goodsInfoMapper.findList(new GoodsInfo(goods)));
return goods;
}
public List<Goods> findList(Goods goods) {
return super.findList(goods);
}
public Page<Goods> findPage(Page<Goods> page, Goods goods) {
return super.findPage(page, goods);
}
@Transactional(readOnly = false)
public void save(Goods goods) {
super.save(goods);
for (GoodsInfo goodsInfo : goods.getGoodsInfoList()){
if (goodsInfo.getId() == null){
continue;
}
if (GoodsInfo.DEL_FLAG_NORMAL.equals(goodsInfo.getDelFlag())){
if (StringUtils.isBlank(goodsInfo.getId())){
goodsInfo.setGoods(goods);
goodsInfo.preInsert();
goodsInfoMapper.insert(goodsInfo);
}else{
goodsInfo.preUpdate();
goodsInfoMapper.update(goodsInfo);
}
}else{
goodsInfoMapper.delete(goodsInfo);
}
}
}
@Transactional(readOnly = false)
public void delete(Goods goods) {
super.delete(goods);
goodsInfoMapper.delete(new GoodsInfo(goods));
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.test.manytoone.web;
package com.jeeplus.modules.warehouse.goods.web;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.List;
import java.util.Map;
......@@ -22,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.multipart.MultipartFile;
import com.google.common.collect.Lists;
......@@ -33,16 +32,16 @@ import com.jeeplus.core.web.BaseController;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.common.utils.excel.ExportExcel;
import com.jeeplus.common.utils.excel.ImportExcel;
import com.jeeplus.modules.test.manytoone.entity.Goods;
import com.jeeplus.modules.test.manytoone.service.GoodsService;
import com.jeeplus.modules.warehouse.goods.entity.Goods;
import com.jeeplus.modules.warehouse.goods.service.GoodsService;
/**
* 商品Controller
* @author liugf
* @version 2018-06-12
* 货品模块Controller
* @author huyi
* @version 2023-02-13
*/
@Controller
@RequestMapping(value = "${adminPath}/test/manytoone/goods")
@RequestMapping(value = "${adminPath}/warehouse/goods/goods")
public class GoodsController extends BaseController {
@Autowired
......@@ -61,20 +60,20 @@ public class GoodsController extends BaseController {
}
/**
* 商品列表页面
* 货品模块列表页面
*/
@RequiresPermissions("test:manytoone:goods:list")
@RequiresPermissions("warehouse:goods:goods:list")
@RequestMapping(value = {"list", ""})
public String list(Goods goods, Model model) {
model.addAttribute("goods", goods);
return "modules/test/manytoone/goodsList";
return "modules/warehouse/goods/goodsList";
}
/**
* 商品列表数据
* 货品模块列表数据
*/
@ResponseBody
@RequiresPermissions("test:manytoone:goods:list")
@RequiresPermissions("warehouse:goods:goods:list")
@RequestMapping(value = "data")
public Map<String, Object> data(Goods goods, HttpServletRequest request, HttpServletResponse response, Model model) {
Page<Goods> page = goodsService.findPage(new Page<Goods>(request, response), goods);
......@@ -82,20 +81,21 @@ public class GoodsController extends BaseController {
}
/**
* 查看,增加,编辑商品表单页面
* 查看,增加,编辑货品模块表单页面
*/
@RequiresPermissions(value={"test:manytoone:goods:view","test:manytoone:goods:add","test:manytoone:goods:edit"},logical=Logical.OR)
@RequestMapping(value = "form")
public String form(Goods goods, Model model) {
@RequiresPermissions(value={"warehouse:goods:goods:view","warehouse:goods:goods:add","warehouse:goods:goods:edit"},logical=Logical.OR)
@RequestMapping(value = "form/{mode}")
public String form(@PathVariable String mode, Goods goods, Model model) {
model.addAttribute("goods", goods);
return "modules/test/manytoone/goodsForm";
model.addAttribute("mode", mode);
return "modules/warehouse/goods/goodsForm";
}
/**
* 保存商品
* 保存货品模块
*/
@ResponseBody
@RequiresPermissions(value={"test:manytoone:goods:add","test:manytoone:goods:edit"},logical=Logical.OR)
@RequiresPermissions(value={"warehouse:goods:goods:add","warehouse:goods:goods:edit"},logical=Logical.OR)
@RequestMapping(value = "save")
public AjaxJson save(Goods goods, Model model) throws Exception{
AjaxJson j = new AjaxJson();
......@@ -111,28 +111,28 @@ public class GoodsController extends BaseController {
//新增或编辑表单保存
goodsService.save(goods);//保存
j.setSuccess(true);
j.setMsg("保存商品成功");
j.setMsg("保存货品模块成功");
return j;
}
/**
* 删除商品
* 删除货品模块
*/
@ResponseBody
@RequiresPermissions("test:manytoone:goods:del")
@RequiresPermissions("warehouse:goods:goods:del")
@RequestMapping(value = "delete")
public AjaxJson delete(Goods goods) {
AjaxJson j = new AjaxJson();
goodsService.delete(goods);
j.setMsg("删除商品成功");
j.setMsg("删除货品模块成功");
return j;
}
/**
* 批量删除商品
* 批量删除货品模块
*/
@ResponseBody
@RequiresPermissions("test:manytoone:goods:del")
@RequiresPermissions("warehouse:goods:goods:del")
@RequestMapping(value = "deleteAll")
public AjaxJson deleteAll(String ids) {
AjaxJson j = new AjaxJson();
......@@ -140,7 +140,7 @@ public class GoodsController extends BaseController {
for(String id : idArray){
goodsService.delete(goodsService.get(id));
}
j.setMsg("删除商品成功");
j.setMsg("删除货品模块成功");
return j;
}
......@@ -148,30 +148,37 @@ public class GoodsController extends BaseController {
* 导出excel文件
*/
@ResponseBody
@RequiresPermissions("test:manytoone:goods:export")
@RequiresPermissions("warehouse:goods:goods:export")
@RequestMapping(value = "export")
public AjaxJson exportFile(Goods goods, HttpServletRequest request, HttpServletResponse response) {
AjaxJson j = new AjaxJson();
try {
String fileName = "商品"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
String fileName = "货品模块"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
Page<Goods> page = goodsService.findPage(new Page<Goods>(request, response, -1), goods);
new ExportExcel("商品", Goods.class).setDataList(page.getList()).write(response, fileName).dispose();
new ExportExcel("货品模块", Goods.class).setDataList(page.getList()).write(response, fileName).dispose();
j.setSuccess(true);
j.setMsg("导出成功!");
return j;
} catch (Exception e) {
j.setSuccess(false);
j.setMsg("导出商品记录失败!失败信息:"+e.getMessage());
j.setMsg("导出货品模块记录失败!失败信息:"+e.getMessage());
}
return j;
}
@ResponseBody
@RequestMapping(value = "detail")
public Goods detail(String id) {
return goodsService.get(id);
}
/**
* 导入Excel数据
*/
@ResponseBody
@RequiresPermissions("test:manytoone:goods:import")
@RequiresPermissions("warehouse:goods:goods:import")
@RequestMapping(value = "import")
public AjaxJson importFile(@RequestParam("file")MultipartFile file, HttpServletResponse response, HttpServletRequest request) {
AjaxJson j = new AjaxJson();
......@@ -192,28 +199,28 @@ public class GoodsController extends BaseController {
}
}
if (failureNum>0){
failureMsg.insert(0, ",失败 "+failureNum+" 条商品记录。");
failureMsg.insert(0, ",失败 "+failureNum+" 条货品模块记录。");
}
j.setMsg( "已成功导入 "+successNum+" 条商品记录"+failureMsg);
j.setMsg( "已成功导入 "+successNum+" 条货品模块记录"+failureMsg);
} catch (Exception e) {
j.setSuccess(false);
j.setMsg("导入商品失败!失败信息:"+e.getMessage());
j.setMsg("导入货品模块失败!失败信息:"+e.getMessage());
}
return j;
}
/**
* 下载导入商品数据模板
* 下载导入货品模块数据模板
*/
@ResponseBody
@RequiresPermissions("test:manytoone:goods:import")
@RequiresPermissions("warehouse:goods:goods:import")
@RequestMapping(value = "import/template")
public AjaxJson importFileTemplate(HttpServletResponse response) {
AjaxJson j = new AjaxJson();
try {
String fileName = "商品数据导入模板.xlsx";
String fileName = "货品模块数据导入模板.xlsx";
List<Goods> list = Lists.newArrayList();
new ExportExcel("商品数据", Goods.class, 1).setDataList(list).write(response, fileName).dispose();
new ExportExcel("货品模块数据", Goods.class, 1).setDataList(list).write(response, fileName).dispose();
return null;
} catch (Exception e) {
j.setSuccess(false);
......@@ -221,5 +228,6 @@ public class GoodsController extends BaseController {
}
return j;
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.ledger.entity;
import com.jeeplus.modules.warehouse.materialtype.entity.MaterialType;
import java.util.List;
import com.google.common.collect.Lists;
import com.jeeplus.core.persistence.DataEntity;
import com.jeeplus.common.utils.excel.annotation.ExcelField;
/**
* 台账信息Entity
* @author huyi
* @version 2023-02-13
*/
public class Ledger extends DataEntity<Ledger> {
private static final long serialVersionUID = 1L;
private String name; // 物资名称
private MaterialType type; // 类型
private String model; // 型号
private String shelvesIds; // 货架id集合
private Integer num; // 数量
private List<LedgerInfo> ledgerInfoList = Lists.newArrayList(); // 子表列表
public Ledger() {
super();
}
public Ledger(String id){
super(id);
}
@ExcelField(title="物资名称", align=2, sort=1)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ExcelField(title="类型", fieldType=MaterialType.class, value="type.name", align=2, sort=2)
public MaterialType getType() {
return type;
}
public void setType(MaterialType type) {
this.type = type;
}
@ExcelField(title="型号", align=2, sort=3)
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
@ExcelField(title="货架id集合", align=2, sort=4)
public String getShelvesIds() {
return shelvesIds;
}
public void setShelvesIds(String shelvesIds) {
this.shelvesIds = shelvesIds;
}
@ExcelField(title="数量", align=2, sort=5)
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public List<LedgerInfo> getLedgerInfoList() {
return ledgerInfoList;
}
public void setLedgerInfoList(List<LedgerInfo> ledgerInfoList) {
this.ledgerInfoList = ledgerInfoList;
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.ledger.entity;
import com.jeeplus.modules.warehouse.goods.entity.GoodsInfo;
import com.jeeplus.modules.warehouse.materialtype.entity.MaterialType;
import com.jeeplus.modules.warehouse.qrcode.entity.QrCode;
import com.jeeplus.modules.warehouse.shelves.entity.Shelves;
import com.jeeplus.core.persistence.DataEntity;
import com.jeeplus.common.utils.excel.annotation.ExcelField;
/**
* 台账明细Entity
* @author huyi
* @version 2023-02-13
*/
public class LedgerInfo extends DataEntity<LedgerInfo> {
private static final long serialVersionUID = 1L;
private String name; // 物资名称
private MaterialType type; // 类型
private String model; // 型号
private String batchNum; // 批次号
private Ledger ledger; // 主表外键 父类
private GoodsInfo goodsInfo; // 货品明细
private QrCode qr; // 二维码id
private Shelves shelves; // 货架id
private String code; // 物资编码
public LedgerInfo() {
super();
}
public LedgerInfo(String id){
super(id);
}
public LedgerInfo(Ledger ledger){
this.ledger = ledger;
}
@ExcelField(title="物资名称", align=2, sort=1)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ExcelField(title="类型", fieldType=MaterialType.class, value="type.code", align=2, sort=2)
public MaterialType getType() {
return type;
}
public void setType(MaterialType type) {
this.type = type;
}
@ExcelField(title="型号", align=2, sort=3)
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
@ExcelField(title="批次号", align=2, sort=4)
public String getBatchNum() {
return batchNum;
}
public void setBatchNum(String batchNum) {
this.batchNum = batchNum;
}
public Ledger getLedger() {
return ledger;
}
public void setLedger(Ledger ledger) {
this.ledger = ledger;
}
@ExcelField(title="货品明细id", align=2, sort=6)
public GoodsInfo getGoodsInfo() {
return goodsInfo;
}
public void setGoodsInfo(GoodsInfo goodsInfo) {
this.goodsInfo = goodsInfo;
}
@ExcelField(title="二维码id", align=2, sort=7)
public QrCode getQr() {
return qr;
}
public void setQr(QrCode qr) {
this.qr = qr;
}
@ExcelField(title="货架id", fieldType=Shelves.class, value="shelves.name", align=2, sort=8)
public Shelves getShelves() {
return shelves;
}
public void setShelves(Shelves shelves) {
this.shelves = shelves;
}
@ExcelField(title="物资编码", align=2, sort=9)
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.test.manytomany.mapper;
package com.jeeplus.modules.warehouse.ledger.mapper;
import com.jeeplus.core.persistence.BaseMapper;
import com.jeeplus.core.persistence.annotation.MyBatisMapper;
import com.jeeplus.modules.test.manytomany.entity.Course;
import com.jeeplus.modules.warehouse.ledger.entity.LedgerInfo;
/**
* 课程MAPPER接口
* @author lgf
* @version 2018-06-12
* 台账明细MAPPER接口
* @author huyi
* @version 2023-02-13
*/
@MyBatisMapper
public interface CourseMapper extends BaseMapper<Course> {
public interface LedgerInfoMapper extends BaseMapper<LedgerInfo> {
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.ledger.mapper;
import com.jeeplus.core.persistence.BaseMapper;
import com.jeeplus.core.persistence.annotation.MyBatisMapper;
import com.jeeplus.modules.warehouse.ledger.entity.Ledger;
/**
* 台账信息MAPPER接口
* @author huyi
* @version 2023-02-13
*/
@MyBatisMapper
public interface LedgerMapper extends BaseMapper<Ledger> {
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeeplus.modules.warehouse.ledger.mapper.LedgerInfoMapper">
<sql id="ledgerInfoColumns">
a.id AS "id",
a.name AS "name",
a.type_id AS "type.id",
a.model AS "model",
a.batch_num AS "batchNum",
a.ledger_id AS "ledger.id",
a.goods_info_id AS "goodsInfo.id",
a.qr_id AS "qr.id",
a.shelves_id AS "shelves.id",
a.code AS "code",
a.create_by AS "createBy.id",
a.create_date AS "createDate",
a.update_by AS "updateBy.id",
a.update_date AS "updateDate",
a.remarks AS "remarks",
a.del_flag AS "delFlag",
type.code AS "type.code",
type.name AS "type.name",
shelves.name AS "shelves.name"
</sql>
<sql id="ledgerInfoJoins">
LEFT JOIN t_wh_material_type type ON type.id = a.type_id
LEFT JOIN t_wh_ledger b ON b.id = a.ledger_id
LEFT JOIN t_wh_shelves shelves ON shelves.id = a.shelves_id
</sql>
<select id="get" resultType="LedgerInfo" >
SELECT
<include refid="ledgerInfoColumns"/>
FROM t_wh_ledger_info a
<include refid="ledgerInfoJoins"/>
WHERE a.id = #{id}
</select>
<select id="findList" resultType="LedgerInfo" >
SELECT
<include refid="ledgerInfoColumns"/>
FROM t_wh_ledger_info a
<include refid="ledgerInfoJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
<if test="name != null and name != ''">
AND a.name LIKE
<if test="dbName == 'oracle'">'%'||#{name}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{name}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{name},'%')</if>
</if>
<if test="type != null and type.id != null and type.id != ''">
AND a.type_id = #{type.id}
</if>
<if test="model != null and model != ''">
AND a.model LIKE
<if test="dbName == 'oracle'">'%'||#{model}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{model}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{model},'%')</if>
</if>
<if test="batchNum != null and batchNum != ''">
AND a.batch_num LIKE
<if test="dbName == 'oracle'">'%'||#{batchNum}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{batchNum}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{batchNum},'%')</if>
</if>
<if test="ledger != null and ledger.id != null and ledger.id != ''">
AND a.ledger_id = #{ledger.id}
</if>
<if test="shelves != null and shelves.id != null and shelves.id != ''">
AND a.shelves_id = #{shelves.id}
</if>
<if test="code != null and code != ''">
AND a.code LIKE
<if test="dbName == 'oracle'">'%'||#{code}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{code}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{code},'%')</if>
</if>
</where>
<choose>
<when test="page !=null and page.orderBy != null and page.orderBy != ''">
ORDER BY ${page.orderBy}
</when>
<otherwise>
ORDER BY a.create_date ASC
</otherwise>
</choose>
</select>
<select id="findAllList" resultType="LedgerInfo" >
SELECT
<include refid="ledgerInfoColumns"/>
FROM t_wh_ledger_info a
<include refid="ledgerInfoJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
</where>
<choose>
<when test="page !=null and page.orderBy != null and page.orderBy != ''">
ORDER BY ${page.orderBy}
</when>
<otherwise>
ORDER BY a.create_date ASC
</otherwise>
</choose>
</select>
<insert id="insert">
INSERT INTO t_wh_ledger_info(
id,
name,
type_id,
model,
batch_num,
ledger_id,
goods_info_id,
qr_id,
shelves_id,
code,
create_by,
create_date,
update_by,
update_date,
remarks,
del_flag
) VALUES (
#{id},
#{name},
#{type.id},
#{model},
#{batchNum},
#{ledger.id},
#{goodsInfo.id},
#{qr.id},
#{shelves.id},
#{code},
#{createBy.id},
#{createDate},
#{updateBy.id},
#{updateDate},
#{remarks},
#{delFlag}
)
</insert>
<update id="update">
UPDATE t_wh_ledger_info SET
name = #{name},
type_id = #{type.id},
model = #{model},
batch_num = #{batchNum},
ledger_id = #{ledger.id},
goods_info_id = #{goodsInfo.id},
qr_id = #{qr.id},
shelves_id = #{shelves.id},
code = #{code},
update_by = #{updateBy.id},
update_date = #{updateDate},
remarks = #{remarks}
WHERE id = #{id}
</update>
<!--物理删除-->
<update id="delete">
DELETE FROM t_wh_ledger_info
<choose>
<when test="id !=null and id != ''">
WHERE id = #{id}
</when>
<otherwise>
WHERE ledger_id = #{ledger.id}
</otherwise>
</choose>
</update>
<!--逻辑删除-->
<update id="deleteByLogic">
UPDATE t_wh_ledger_info SET
del_flag = #{DEL_FLAG_DELETE}
<choose>
<when test="id !=null and id != ''">
WHERE id = #{id}
</when>
<otherwise>
WHERE ledger_id = #{ledger.id}
</otherwise>
</choose>
</update>
<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
<select id="findUniqueByProperty" resultType="LedgerInfo" statementType="STATEMENT">
select * FROM t_wh_ledger_info where ${propertyName} = '${value}'
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeeplus.modules.test.onetomany.form.mapper.TestDataMain2Mapper">
<mapper namespace="com.jeeplus.modules.warehouse.ledger.mapper.LedgerMapper">
<sql id="testDataMain2Columns">
<sql id="ledgerColumns">
a.id AS "id",
a.user_id AS "tuser.id",
a.office_id AS "office.id",
a.area_id AS "area.id",
a.name AS "name",
a.sex AS "sex",
a.in_date AS "inDate",
a.type_id AS "type.id",
a.model AS "model",
a.shelvesids AS "shelvesIds",
a.num AS "num",
a.create_by AS "createBy.id",
a.create_date AS "createDate",
a.update_by AS "updateBy.id",
......@@ -17,51 +16,56 @@
a.remarks AS "remarks",
a.del_flag AS "delFlag",
tuser.name AS "tuser.name",
office.name AS "office.name",
area.name AS "area.name"
type.name AS "type.name",
type.code AS "type.code"
</sql>
<sql id="testDataMain2Joins">
<sql id="ledgerJoins">
LEFT JOIN sys_user tuser ON tuser.id = a.user_id
LEFT JOIN sys_office office ON office.id = a.office_id
LEFT JOIN sys_area area ON area.id = a.area_id
LEFT JOIN t_wh_material_type type ON type.id = a.type_id
</sql>
<select id="get" resultType="TestDataMain2" >
<select id="get" resultType="Ledger" >
SELECT
<include refid="testDataMain2Columns"/>
FROM test_data_main a
<include refid="testDataMain2Joins"/>
<include refid="ledgerColumns"/>
FROM t_wh_ledger a
<include refid="ledgerJoins"/>
WHERE a.id = #{id}
</select>
<select id="findList" resultType="TestDataMain2" >
<select id="findList" resultType="Ledger" >
SELECT
<include refid="testDataMain2Columns"/>
FROM test_data_main a
<include refid="testDataMain2Joins"/>
<include refid="ledgerColumns"/>
FROM t_wh_ledger a
<include refid="ledgerJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
<if test="tuser != null and tuser.id != null and tuser.id != ''">
AND a.user_id = #{tuser.id}
</if>
<if test="name != null and name != ''">
AND a.name LIKE
<if test="dbName == 'oracle'">'%'||#{name}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{name}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{name},'%')</if>
</if>
<if test="sex != null and sex != ''">
AND a.sex = #{sex}
<if test="type != null and type.id != null and type.id != ''">
AND a.type_id = #{type.id}
</if>
<if test="model != null and model != ''">
AND a.model LIKE
<if test="dbName == 'oracle'">'%'||#{model}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{model}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{model},'%')</if>
</if>
<if test="shelvesIds != null and shelvesIds != ''">
AND a.shelvesids LIKE
<if test="dbName == 'oracle'">'%'||#{shelvesIds}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{shelvesIds}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{shelvesIds},'%')</if>
</if>
<if test="beginInDate != null and endInDate != null ">
AND a.in_date BETWEEN #{beginInDate} AND #{endInDate}
<if test="num != null and num != ''">
AND a.num >= #{num}
</if>
</where>
<choose>
......@@ -74,11 +78,11 @@
</choose>
</select>
<select id="findAllList" resultType="TestDataMain2" >
<select id="findAllList" resultType="Ledger" >
SELECT
<include refid="testDataMain2Columns"/>
FROM test_data_main a
<include refid="testDataMain2Joins"/>
<include refid="ledgerColumns"/>
FROM t_wh_ledger a
<include refid="ledgerJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
......@@ -94,14 +98,13 @@
</select>
<insert id="insert">
INSERT INTO test_data_main(
INSERT INTO t_wh_ledger(
id,
user_id,
office_id,
area_id,
name,
sex,
in_date,
type_id,
model,
shelvesids,
num,
create_by,
create_date,
update_by,
......@@ -110,12 +113,11 @@
del_flag
) VALUES (
#{id},
#{tuser.id},
#{office.id},
#{area.id},
#{name},
#{sex},
#{inDate},
#{type.id},
#{model},
#{shelvesIds},
#{num},
#{createBy.id},
#{createDate},
#{updateBy.id},
......@@ -126,14 +128,12 @@
</insert>
<update id="update">
UPDATE test_data_main SET
user_id = #{tuser.id},
office_id = #{office.id},
area_id = #{area.id},
UPDATE t_wh_ledger SET
name = #{name},
sex = #{sex},
in_date = #{inDate},
create_date = #{createDate},
type_id = #{type.id},
model = #{model},
shelvesids = #{shelvesIds},
num = #{num},
update_by = #{updateBy.id},
update_date = #{updateDate},
remarks = #{remarks}
......@@ -143,21 +143,21 @@
<!--物理删除-->
<update id="delete">
DELETE FROM test_data_main
DELETE FROM t_wh_ledger
WHERE id = #{id}
</update>
<!--逻辑删除-->
<update id="deleteByLogic">
UPDATE test_data_main SET
UPDATE t_wh_ledger SET
del_flag = #{DEL_FLAG_DELETE}
WHERE id = #{id}
</update>
<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
<select id="findUniqueByProperty" resultType="TestDataMain2" statementType="STATEMENT">
select * FROM test_data_main where ${propertyName} = '${value}'
<select id="findUniqueByProperty" resultType="Ledger" statementType="STATEMENT">
select * FROM t_wh_ledger where ${propertyName} = '${value}'
</select>
</mapper>
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.ledger.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jeeplus.core.persistence.Page;
import com.jeeplus.core.service.CrudService;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.modules.warehouse.ledger.entity.Ledger;
import com.jeeplus.modules.warehouse.ledger.mapper.LedgerMapper;
import com.jeeplus.modules.warehouse.ledger.entity.LedgerInfo;
import com.jeeplus.modules.warehouse.ledger.mapper.LedgerInfoMapper;
/**
* 台账信息Service
* @author huyi
* @version 2023-02-13
*/
@Service
@Transactional(readOnly = true)
public class LedgerService extends CrudService<LedgerMapper, Ledger> {
@Autowired
private LedgerInfoMapper ledgerInfoMapper;
public Ledger get(String id) {
Ledger ledger = super.get(id);
ledger.setLedgerInfoList(ledgerInfoMapper.findList(new LedgerInfo(ledger)));
return ledger;
}
public List<Ledger> findList(Ledger ledger) {
return super.findList(ledger);
}
public Page<Ledger> findPage(Page<Ledger> page, Ledger ledger) {
return super.findPage(page, ledger);
}
@Transactional(readOnly = false)
public void save(Ledger ledger) {
super.save(ledger);
for (LedgerInfo ledgerInfo : ledger.getLedgerInfoList()){
if (ledgerInfo.getId() == null){
continue;
}
if (LedgerInfo.DEL_FLAG_NORMAL.equals(ledgerInfo.getDelFlag())){
if (StringUtils.isBlank(ledgerInfo.getId())){
ledgerInfo.setLedger(ledger);
ledgerInfo.preInsert();
ledgerInfoMapper.insert(ledgerInfo);
}else{
ledgerInfo.preUpdate();
ledgerInfoMapper.update(ledgerInfo);
}
}else{
ledgerInfoMapper.delete(ledgerInfo);
}
}
}
@Transactional(readOnly = false)
public void delete(Ledger ledger) {
super.delete(ledger);
ledgerInfoMapper.delete(new LedgerInfo(ledger));
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.qrcode.entity;
import com.jeeplus.core.persistence.DataEntity;
import com.jeeplus.common.utils.excel.annotation.ExcelField;
import com.jeeplus.modules.warehouse.goods.entity.GoodsInfo;
/**
* 二维码Entity
* @author 胡懿
* @version 2023-02-13
*/
public class QrCode extends DataEntity<QrCode> {
private static final long serialVersionUID = 1L;
private GoodsInfo goodsInfo; // 货品明细外键
private String code; // 物资编码
private String url; // 二维码存储路径
public QrCode() {
super();
}
public QrCode(String id){
super(id);
}
@ExcelField(title="货品明细外键", align=2, sort=1)
public GoodsInfo getGoodsInfo() {
return goodsInfo;
}
public void setGoodsInfo(GoodsInfo goodsInfo) {
this.goodsInfo = goodsInfo;
}
@ExcelField(title="物资编码", align=2, sort=2)
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@ExcelField(title="二维码存储路径", align=2, sort=3)
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.qrcode.mapper;
import com.jeeplus.core.persistence.BaseMapper;
import com.jeeplus.core.persistence.annotation.MyBatisMapper;
import com.jeeplus.modules.warehouse.qrcode.entity.QrCode;
/**
* 二维码MAPPER接口
* @author 胡懿
* @version 2023-02-13
*/
@MyBatisMapper
public interface QrCodeMapper extends BaseMapper<QrCode> {
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeeplus.modules.test.manytomany.mapper.CourseMapper">
<mapper namespace="com.jeeplus.modules.warehouse.qrcode.mapper.QrCodeMapper">
<sql id="courseColumns">
<sql id="qrCodeColumns">
a.id AS "id",
a.name AS "name",
a.goods_info_id AS "goodsInfo.id",
a.code AS "code",
a.url AS "url",
a.create_by AS "createBy.id",
a.create_date AS "createDate",
a.update_by AS "updateBy.id",
......@@ -13,29 +15,29 @@
a.del_flag AS "delFlag"
</sql>
<sql id="courseJoins">
<sql id="qrCodeJoins">
</sql>
<select id="get" resultType="Course" >
<select id="get" resultType="QrCode" >
SELECT
<include refid="courseColumns"/>
FROM test_course a
<include refid="courseJoins"/>
<include refid="qrCodeColumns"/>
FROM t_wh_qr a
<include refid="qrCodeJoins"/>
WHERE a.id = #{id}
</select>
<select id="findList" resultType="Course" >
<select id="findList" resultType="QrCode" >
SELECT
<include refid="courseColumns"/>
FROM test_course a
<include refid="courseJoins"/>
<include refid="qrCodeColumns"/>
FROM t_wh_qr a
<include refid="qrCodeJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
<if test="name != null and name != ''">
AND a.name = #{name}
<if test="code != null and code != ''">
AND a.code = #{code}
</if>
</where>
<choose>
......@@ -48,11 +50,11 @@
</choose>
</select>
<select id="findAllList" resultType="Course" >
<select id="findAllList" resultType="QrCode" >
SELECT
<include refid="courseColumns"/>
FROM test_course a
<include refid="courseJoins"/>
<include refid="qrCodeColumns"/>
FROM t_wh_qr a
<include refid="qrCodeJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
......@@ -68,9 +70,11 @@
</select>
<insert id="insert">
INSERT INTO test_course(
INSERT INTO t_wh_qr(
id,
name,
goods_info_id,
code,
url,
create_by,
create_date,
update_by,
......@@ -79,7 +83,9 @@
del_flag
) VALUES (
#{id},
#{name},
#{goodsInfo.id},
#{code},
#{url},
#{createBy.id},
#{createDate},
#{updateBy.id},
......@@ -90,8 +96,10 @@
</insert>
<update id="update">
UPDATE test_course SET
name = #{name},
UPDATE t_wh_qr SET
goods_info_id = #{goodsInfo.id},
code = #{code},
url = #{url},
update_by = #{updateBy.id},
update_date = #{updateDate},
remarks = #{remarks}
......@@ -101,21 +109,21 @@
<!--物理删除-->
<update id="delete">
DELETE FROM test_course
DELETE FROM t_wh_qr
WHERE id = #{id}
</update>
<!--逻辑删除-->
<update id="deleteByLogic">
UPDATE test_course SET
UPDATE t_wh_qr SET
del_flag = #{DEL_FLAG_DELETE}
WHERE id = #{id}
</update>
<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
<select id="findUniqueByProperty" resultType="Course" statementType="STATEMENT">
select * FROM test_course where ${propertyName} = '${value}'
<select id="findUniqueByProperty" resultType="QrCode" statementType="STATEMENT">
select * FROM t_wh_qr where ${propertyName} = '${value}'
</select>
</mapper>
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.qrcode.service;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jeeplus.core.persistence.Page;
import com.jeeplus.core.service.CrudService;
import com.jeeplus.modules.warehouse.qrcode.entity.QrCode;
import com.jeeplus.modules.warehouse.qrcode.mapper.QrCodeMapper;
/**
* 二维码Service
* @author 胡懿
* @version 2023-02-13
*/
@Service
@Transactional(readOnly = true)
public class QrCodeService extends CrudService<QrCodeMapper, QrCode> {
public QrCode get(String id) {
return super.get(id);
}
public List<QrCode> findList(QrCode qrCode) {
return super.findList(qrCode);
}
public Page<QrCode> findPage(Page<QrCode> page, QrCode qrCode) {
return super.findPage(page, qrCode);
}
@Transactional(readOnly = false)
public void save(QrCode qrCode) {
super.save(qrCode);
}
@Transactional(readOnly = false)
public void delete(QrCode qrCode) {
super.delete(qrCode);
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.test.one.form.web;
package com.jeeplus.modules.warehouse.qrcode.web;
import java.util.List;
import java.util.Map;
......@@ -32,115 +32,115 @@ import com.jeeplus.core.web.BaseController;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.common.utils.excel.ExportExcel;
import com.jeeplus.common.utils.excel.ImportExcel;
import com.jeeplus.modules.test.one.form.entity.Leave2;
import com.jeeplus.modules.test.one.form.service.Leave2Service;
import com.jeeplus.modules.warehouse.qrcode.entity.QrCode;
import com.jeeplus.modules.warehouse.qrcode.service.QrCodeService;
/**
* 请假表单Controller
* @author lgf
* @version 2018-06-12
* 二维码Controller
* @author 胡懿
* @version 2023-02-13
*/
@Controller
@RequestMapping(value = "${adminPath}/test/one/form/leave2")
public class Leave2Controller extends BaseController {
@RequestMapping(value = "${adminPath}/warehouse/qrcode/qrCode")
public class QrCodeController extends BaseController {
@Autowired
private Leave2Service leave2Service;
private QrCodeService qrCodeService;
@ModelAttribute
public Leave2 get(@RequestParam(required=false) String id) {
Leave2 entity = null;
public QrCode get(@RequestParam(required=false) String id) {
QrCode entity = null;
if (StringUtils.isNotBlank(id)){
entity = leave2Service.get(id);
entity = qrCodeService.get(id);
}
if (entity == null){
entity = new Leave2();
entity = new QrCode();
}
return entity;
}
/**
* 请假表单列表页面
* 二维码列表页面
*/
@RequiresPermissions("test:one:form:leave2:list")
@RequiresPermissions("warehouse:qrcode:qrCode:list")
@RequestMapping(value = {"list", ""})
public String list(Leave2 leave2, Model model) {
model.addAttribute("leave2", leave2);
return "modules/test/one/form/leave2List";
public String list(QrCode qrCode, Model model) {
model.addAttribute("qrCode", qrCode);
return "modules/warehouse/qrcode/qrCodeList";
}
/**
* 请假表单列表数据
* 二维码列表数据
*/
@ResponseBody
@RequiresPermissions("test:one:form:leave2:list")
@RequiresPermissions("warehouse:qrcode:qrCode:list")
@RequestMapping(value = "data")
public Map<String, Object> data(Leave2 leave2, HttpServletRequest request, HttpServletResponse response, Model model) {
Page<Leave2> page = leave2Service.findPage(new Page<Leave2>(request, response), leave2);
public Map<String, Object> data(QrCode qrCode, HttpServletRequest request, HttpServletResponse response, Model model) {
Page<QrCode> page = qrCodeService.findPage(new Page<QrCode>(request, response), qrCode);
return getBootstrapData(page);
}
/**
* 查看,增加,编辑请假表单表单页面
* 查看,增加,编辑二维码表单页面
*/
@RequiresPermissions(value={"test:one:form:leave2:view","test:one:form:leave2:add","test:one:form:leave2:edit"},logical=Logical.OR)
@RequiresPermissions(value={"warehouse:qrcode:qrCode:view","warehouse:qrcode:qrCode:add","warehouse:qrcode:qrCode:edit"},logical=Logical.OR)
@RequestMapping(value = "form/{mode}")
public String form(@PathVariable String mode, Leave2 leave2, Model model) {
model.addAttribute("leave2", leave2);
public String form(@PathVariable String mode, QrCode qrCode, Model model) {
model.addAttribute("qrCode", qrCode);
model.addAttribute("mode", mode);
return "modules/test/one/form/leave2Form";
return "modules/warehouse/qrcode/qrCodeForm";
}
/**
* 保存请假表单
* 保存二维码
*/
@ResponseBody
@RequiresPermissions(value={"test:one:form:leave2:add","test:one:form:leave2:edit"},logical=Logical.OR)
@RequiresPermissions(value={"warehouse:qrcode:qrCode:add","warehouse:qrcode:qrCode:edit"},logical=Logical.OR)
@RequestMapping(value = "save")
public AjaxJson save(Leave2 leave2, Model model) throws Exception{
public AjaxJson save(QrCode qrCode, Model model) throws Exception{
AjaxJson j = new AjaxJson();
/**
* 后台hibernate-validation插件校验
*/
String errMsg = beanValidator(leave2);
String errMsg = beanValidator(qrCode);
if (StringUtils.isNotBlank(errMsg)){
j.setSuccess(false);
j.setMsg(errMsg);
return j;
}
//新增或编辑表单保存
leave2Service.save(leave2);//保存
qrCodeService.save(qrCode);//保存
j.setSuccess(true);
j.setMsg("保存请假表单成功");
j.setMsg("保存二维码成功");
return j;
}
/**
* 删除请假表单
* 删除二维码
*/
@ResponseBody
@RequiresPermissions("test:one:form:leave2:del")
@RequiresPermissions("warehouse:qrcode:qrCode:del")
@RequestMapping(value = "delete")
public AjaxJson delete(Leave2 leave2) {
public AjaxJson delete(QrCode qrCode) {
AjaxJson j = new AjaxJson();
leave2Service.delete(leave2);
j.setMsg("删除请假表单成功");
qrCodeService.delete(qrCode);
j.setMsg("删除二维码成功");
return j;
}
/**
* 批量删除请假表单
* 批量删除二维码
*/
@ResponseBody
@RequiresPermissions("test:one:form:leave2:del")
@RequiresPermissions("warehouse:qrcode:qrCode:del")
@RequestMapping(value = "deleteAll")
public AjaxJson deleteAll(String ids) {
AjaxJson j = new AjaxJson();
String idArray[] =ids.split(",");
for(String id : idArray){
leave2Service.delete(leave2Service.get(id));
qrCodeService.delete(qrCodeService.get(id));
}
j.setMsg("删除请假表单成功");
j.setMsg("删除二维码成功");
return j;
}
......@@ -148,20 +148,20 @@ public class Leave2Controller extends BaseController {
* 导出excel文件
*/
@ResponseBody
@RequiresPermissions("test:one:form:leave2:export")
@RequiresPermissions("warehouse:qrcode:qrCode:export")
@RequestMapping(value = "export")
public AjaxJson exportFile(Leave2 leave2, HttpServletRequest request, HttpServletResponse response) {
public AjaxJson exportFile(QrCode qrCode, HttpServletRequest request, HttpServletResponse response) {
AjaxJson j = new AjaxJson();
try {
String fileName = "请假表单"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
Page<Leave2> page = leave2Service.findPage(new Page<Leave2>(request, response, -1), leave2);
new ExportExcel("请假表单", Leave2.class).setDataList(page.getList()).write(response, fileName).dispose();
String fileName = "二维码"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
Page<QrCode> page = qrCodeService.findPage(new Page<QrCode>(request, response, -1), qrCode);
new ExportExcel("二维码", QrCode.class).setDataList(page.getList()).write(response, fileName).dispose();
j.setSuccess(true);
j.setMsg("导出成功!");
return j;
} catch (Exception e) {
j.setSuccess(false);
j.setMsg("导出请假表单记录失败!失败信息:"+e.getMessage());
j.setMsg("导出二维码记录失败!失败信息:"+e.getMessage());
}
return j;
}
......@@ -171,7 +171,7 @@ public class Leave2Controller extends BaseController {
*/
@ResponseBody
@RequiresPermissions("test:one:form:leave2:import")
@RequiresPermissions("warehouse:qrcode:qrCode:import")
@RequestMapping(value = "import")
public AjaxJson importFile(@RequestParam("file")MultipartFile file, HttpServletResponse response, HttpServletRequest request) {
AjaxJson j = new AjaxJson();
......@@ -180,10 +180,10 @@ public class Leave2Controller extends BaseController {
int failureNum = 0;
StringBuilder failureMsg = new StringBuilder();
ImportExcel ei = new ImportExcel(file, 1, 0);
List<Leave2> list = ei.getDataList(Leave2.class);
for (Leave2 leave2 : list){
List<QrCode> list = ei.getDataList(QrCode.class);
for (QrCode qrCode : list){
try{
leave2Service.save(leave2);
qrCodeService.save(qrCode);
successNum++;
}catch(ConstraintViolationException ex){
failureNum++;
......@@ -192,28 +192,28 @@ public class Leave2Controller extends BaseController {
}
}
if (failureNum>0){
failureMsg.insert(0, ",失败 "+failureNum+" 条请假表单记录。");
failureMsg.insert(0, ",失败 "+failureNum+" 条二维码记录。");
}
j.setMsg( "已成功导入 "+successNum+" 条请假表单记录"+failureMsg);
j.setMsg( "已成功导入 "+successNum+" 条二维码记录"+failureMsg);
} catch (Exception e) {
j.setSuccess(false);
j.setMsg("导入请假表单失败!失败信息:"+e.getMessage());
j.setMsg("导入二维码失败!失败信息:"+e.getMessage());
}
return j;
}
/**
* 下载导入请假表单数据模板
* 下载导入二维码数据模板
*/
@ResponseBody
@RequiresPermissions("test:one:form:leave2:import")
@RequiresPermissions("warehouse:qrcode:qrCode:import")
@RequestMapping(value = "import/template")
public AjaxJson importFileTemplate(HttpServletResponse response) {
AjaxJson j = new AjaxJson();
try {
String fileName = "请假表单数据导入模板.xlsx";
List<Leave2> list = Lists.newArrayList();
new ExportExcel("请假表单数据", Leave2.class, 1).setDataList(list).write(response, fileName).dispose();
String fileName = "二维码数据导入模板.xlsx";
List<QrCode> list = Lists.newArrayList();
new ExportExcel("二维码数据", QrCode.class, 1).setDataList(list).write(response, fileName).dispose();
return null;
} catch (Exception e) {
j.setSuccess(false);
......
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.storage.entity;
import com.jeeplus.modules.sys.entity.User;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.List;
import com.google.common.collect.Lists;
import com.jeeplus.core.persistence.DataEntity;
import com.jeeplus.common.utils.excel.annotation.ExcelField;
/**
* 入库信息Entity
* @author huyi
* @version 2023-02-13
*/
public class Storage extends DataEntity<Storage> {
private static final long serialVersionUID = 1L;
private String code; // 入库单
private User operator; // 操作人
private Date time; // 时间
private String batchNum; // 批次号
private Date beginTime; // 开始 时间
private Date endTime; // 结束 时间
private List<StorageInfo> storageInfoList = Lists.newArrayList(); // 子表列表
public Storage() {
super();
}
public Storage(String id){
super(id);
}
@ExcelField(title="入库单", align=2, sort=1)
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@ExcelField(title="操作人", fieldType=User.class, value="operator.name", align=2, sort=2)
public User getOperator() {
return operator;
}
public void setOperator(User operator) {
this.operator = operator;
}
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelField(title="时间", align=2, sort=3)
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
@ExcelField(title="批次号", align=2, sort=4)
public String getBatchNum() {
return batchNum;
}
public void setBatchNum(String batchNum) {
this.batchNum = batchNum;
}
public Date getBeginTime() {
return beginTime;
}
public void setBeginTime(Date beginTime) {
this.beginTime = beginTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public List<StorageInfo> getStorageInfoList() {
return storageInfoList;
}
public void setStorageInfoList(List<StorageInfo> storageInfoList) {
this.storageInfoList = storageInfoList;
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.storage.entity;
import com.jeeplus.modules.warehouse.goods.entity.GoodsInfo;
import com.jeeplus.modules.warehouse.materialtype.entity.MaterialType;
import com.jeeplus.modules.warehouse.shelves.entity.Shelves;
import com.jeeplus.core.persistence.DataEntity;
import com.jeeplus.common.utils.excel.annotation.ExcelField;
/**
* 入库明细Entity
* @author huyi
* @version 2023-02-13
*/
public class StorageInfo extends DataEntity<StorageInfo> {
private static final long serialVersionUID = 1L;
private Storage storage; // 主表id 父类
private String name; // 名称
private MaterialType type; // 类型
private String model; // 型号
private GoodsInfo goodsInfo; // 货品明细id
private Shelves shelves; // 货架id
public StorageInfo() {
super();
}
public StorageInfo(String id){
super(id);
}
public StorageInfo(Storage storage){
this.storage = storage;
}
public Storage getStorage() {
return storage;
}
public void setStorage(Storage storage) {
this.storage = storage;
}
@ExcelField(title="名称", align=2, sort=2)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ExcelField(title="类型", fieldType=MaterialType.class, value="type.name", align=2, sort=3)
public MaterialType getType() {
return type;
}
public void setType(MaterialType type) {
this.type = type;
}
@ExcelField(title="型号", align=2, sort=4)
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
@ExcelField(title="货品明细id", align=2, sort=5)
public GoodsInfo getGoodsInfo() {
return goodsInfo;
}
public void setGoodsInfo(GoodsInfo goodsInfo) {
this.goodsInfo = goodsInfo;
}
@ExcelField(title="货架id", fieldType=Shelves.class, value="shelves.name", align=2, sort=6)
public Shelves getShelves() {
return shelves;
}
public void setShelves(Shelves shelves) {
this.shelves = shelves;
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.storage.mapper;
import com.jeeplus.core.persistence.BaseMapper;
import com.jeeplus.core.persistence.annotation.MyBatisMapper;
import com.jeeplus.modules.warehouse.storage.entity.StorageInfo;
/**
* 入库明细MAPPER接口
* @author huyi
* @version 2023-02-13
*/
@MyBatisMapper
public interface StorageInfoMapper extends BaseMapper<StorageInfo> {
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.storage.mapper;
import com.jeeplus.core.persistence.BaseMapper;
import com.jeeplus.core.persistence.annotation.MyBatisMapper;
import com.jeeplus.modules.warehouse.storage.entity.Storage;
/**
* 入库信息MAPPER接口
* @author huyi
* @version 2023-02-13
*/
@MyBatisMapper
public interface StorageMapper extends BaseMapper<Storage> {
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeeplus.modules.warehouse.storage.mapper.StorageInfoMapper">
<sql id="storageInfoColumns">
a.id AS "id",
a.storage_id AS "storage.id",
a.name AS "name",
a.type_id AS "type.id",
a.model AS "model",
a.goods_info_id AS "goodsInfo.id",
a.shelves_id AS "shelves.id",
a.remarks AS "remarks",
a.create_by AS "createBy.id",
a.create_date AS "createDate",
a.update_by AS "updateBy.id",
a.update_date AS "updateDate",
a.del_flag AS "delFlag",
b.name AS "storage.name",
type.name AS "type.name",
type.code AS "type.code",
shelves.name AS "shelves.name"
</sql>
<sql id="storageInfoJoins">
LEFT JOIN t_wh_storage b ON b.id = a.storage_id
LEFT JOIN t_wh_material_type type ON type.id = a.type_id
LEFT JOIN t_wh_shelves shelves ON shelves.id = a.shelves_id
</sql>
<select id="get" resultType="StorageInfo" >
SELECT
<include refid="storageInfoColumns"/>
FROM t_wh_storage_info a
<include refid="storageInfoJoins"/>
WHERE a.id = #{id}
</select>
<select id="findList" resultType="StorageInfo" >
SELECT
<include refid="storageInfoColumns"/>
FROM t_wh_storage_info a
<include refid="storageInfoJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
<if test="storage != null and storage.id != null and storage.id != ''">
AND a.storage_id = #{storage.id}
</if>
<if test="name != null and name != ''">
AND a.name LIKE
<if test="dbName == 'oracle'">'%'||#{name}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{name}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{name},'%')</if>
</if>
<if test="type != null and type.id != null and type.id != ''">
AND a.type_id = #{type.id}
</if>
<if test="model != null and model != ''">
AND a.model LIKE
<if test="dbName == 'oracle'">'%'||#{model}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{model}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{model},'%')</if>
</if>
<if test="shelves != null and shelves.id != null and shelves.id != ''">
AND a.shelves_id = #{shelves.id}
</if>
</where>
<choose>
<when test="page !=null and page.orderBy != null and page.orderBy != ''">
ORDER BY ${page.orderBy}
</when>
<otherwise>
ORDER BY a.create_date ASC
</otherwise>
</choose>
</select>
<select id="findAllList" resultType="StorageInfo" >
SELECT
<include refid="storageInfoColumns"/>
FROM t_wh_storage_info a
<include refid="storageInfoJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
</where>
<choose>
<when test="page !=null and page.orderBy != null and page.orderBy != ''">
ORDER BY ${page.orderBy}
</when>
<otherwise>
ORDER BY a.create_date ASC
</otherwise>
</choose>
</select>
<insert id="insert">
INSERT INTO t_wh_storage_info(
id,
storage_id,
name,
type_id,
model,
goods_info_id,
shelves_id,
remarks,
create_by,
create_date,
update_by,
update_date,
del_flag
) VALUES (
#{id},
#{storage.id},
#{name},
#{type.id},
#{model},
#{goodsInfo.id},
#{shelves.id},
#{remarks},
#{createBy.id},
#{createDate},
#{updateBy.id},
#{updateDate},
#{delFlag}
)
</insert>
<update id="update">
UPDATE t_wh_storage_info SET
storage_id = #{storage.id},
name = #{name},
type_id = #{type.id},
model = #{model},
goods_info_id = #{goodsInfo.id},
shelves_id = #{shelves.id},
remarks = #{remarks},
update_by = #{updateBy.id},
update_date = #{updateDate}
WHERE id = #{id}
</update>
<!--物理删除-->
<update id="delete">
DELETE FROM t_wh_storage_info
<choose>
<when test="id !=null and id != ''">
WHERE id = #{id}
</when>
<otherwise>
WHERE storage_id = #{storage.id}
</otherwise>
</choose>
</update>
<!--逻辑删除-->
<update id="deleteByLogic">
UPDATE t_wh_storage_info SET
del_flag = #{DEL_FLAG_DELETE}
<choose>
<when test="id !=null and id != ''">
WHERE id = #{id}
</when>
<otherwise>
WHERE storage_id = #{storage.id}
</otherwise>
</choose>
</update>
<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
<select id="findUniqueByProperty" resultType="StorageInfo" statementType="STATEMENT">
select * FROM t_wh_storage_info where ${propertyName} = '${value}'
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jeeplus.modules.warehouse.storage.mapper.StorageMapper">
<sql id="storageColumns">
a.id AS "id",
a.code AS "code",
a.operator AS "operator.id",
a.time AS "time",
a.batch_num AS "batchNum",
a.remarks AS "remarks",
a.create_by AS "createBy.id",
a.create_date AS "createDate",
a.update_by AS "updateBy.id",
a.update_date AS "updateDate",
a.del_flag AS "delFlag",
operator.name AS "operator.name"
</sql>
<sql id="storageJoins">
LEFT JOIN sys_user operator ON operator.id = a.operator
</sql>
<select id="get" resultType="Storage" >
SELECT
<include refid="storageColumns"/>
FROM t_wh_storage a
<include refid="storageJoins"/>
WHERE a.id = #{id}
</select>
<select id="findList" resultType="Storage" >
SELECT
<include refid="storageColumns"/>
FROM t_wh_storage a
<include refid="storageJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
<if test="code != null and code != ''">
AND a.code LIKE
<if test="dbName == 'oracle'">'%'||#{code}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{code}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{code},'%')</if>
</if>
<if test="operator != null and operator.id != null and operator.id != ''">
AND a.operator = #{operator.id}
</if>
<if test="beginTime != null and endTime != null ">
AND a.time BETWEEN #{beginTime} AND #{endTime}
</if>
<if test="batchNum != null and batchNum != ''">
AND a.batch_num LIKE
<if test="dbName == 'oracle'">'%'||#{batchNum}||'%'</if>
<if test="dbName == 'mssql'">'%'+#{batchNum}+'%'</if>
<if test="dbName == 'mysql'">concat('%',#{batchNum},'%')</if>
</if>
</where>
<choose>
<when test="page !=null and page.orderBy != null and page.orderBy != ''">
ORDER BY ${page.orderBy}
</when>
<otherwise>
ORDER BY a.update_date DESC
</otherwise>
</choose>
</select>
<select id="findAllList" resultType="Storage" >
SELECT
<include refid="storageColumns"/>
FROM t_wh_storage a
<include refid="storageJoins"/>
<where>
a.del_flag = #{DEL_FLAG_NORMAL}
${dataScope}
</where>
<choose>
<when test="page !=null and page.orderBy != null and page.orderBy != ''">
ORDER BY ${page.orderBy}
</when>
<otherwise>
ORDER BY a.update_date DESC
</otherwise>
</choose>
</select>
<insert id="insert">
INSERT INTO t_wh_storage(
id,
code,
operator,
time,
batch_num,
remarks,
create_by,
create_date,
update_by,
update_date,
del_flag
) VALUES (
#{id},
#{code},
#{operator.id},
#{time},
#{batchNum},
#{remarks},
#{createBy.id},
#{createDate},
#{updateBy.id},
#{updateDate},
#{delFlag}
)
</insert>
<update id="update">
UPDATE t_wh_storage SET
code = #{code},
operator = #{operator.id},
time = #{time},
batch_num = #{batchNum},
remarks = #{remarks},
update_by = #{updateBy.id},
update_date = #{updateDate}
WHERE id = #{id}
</update>
<!--物理删除-->
<update id="delete">
DELETE FROM t_wh_storage
WHERE id = #{id}
</update>
<!--逻辑删除-->
<update id="deleteByLogic">
UPDATE t_wh_storage SET
del_flag = #{DEL_FLAG_DELETE}
WHERE id = #{id}
</update>
<!-- 根据实体名称和字段名称和字段值获取唯一记录 -->
<select id="findUniqueByProperty" resultType="Storage" statementType="STATEMENT">
select * FROM t_wh_storage where ${propertyName} = '${value}'
</select>
</mapper>
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.warehouse.storage.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jeeplus.core.persistence.Page;
import com.jeeplus.core.service.CrudService;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.modules.warehouse.storage.entity.Storage;
import com.jeeplus.modules.warehouse.storage.mapper.StorageMapper;
import com.jeeplus.modules.warehouse.storage.entity.StorageInfo;
import com.jeeplus.modules.warehouse.storage.mapper.StorageInfoMapper;
/**
* 入库信息Service
* @author huyi
* @version 2023-02-13
*/
@Service
@Transactional(readOnly = true)
public class StorageService extends CrudService<StorageMapper, Storage> {
@Autowired
private StorageInfoMapper storageInfoMapper;
public Storage get(String id) {
Storage storage = super.get(id);
storage.setStorageInfoList(storageInfoMapper.findList(new StorageInfo(storage)));
return storage;
}
public List<Storage> findList(Storage storage) {
return super.findList(storage);
}
public Page<Storage> findPage(Page<Storage> page, Storage storage) {
return super.findPage(page, storage);
}
@Transactional(readOnly = false)
public void save(Storage storage) {
super.save(storage);
for (StorageInfo storageInfo : storage.getStorageInfoList()){
if (storageInfo.getId() == null){
continue;
}
if (StorageInfo.DEL_FLAG_NORMAL.equals(storageInfo.getDelFlag())){
if (StringUtils.isBlank(storageInfo.getId())){
storageInfo.setStorage(storage);
storageInfo.preInsert();
storageInfoMapper.insert(storageInfo);
}else{
storageInfo.preUpdate();
storageInfoMapper.update(storageInfo);
}
}else{
storageInfoMapper.delete(storageInfo);
}
}
}
@Transactional(readOnly = false)
public void delete(Storage storage) {
super.delete(storage);
storageInfoMapper.delete(new StorageInfo(storage));
}
}
\ No newline at end of file
/**
* Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
*/
package com.jeeplus.modules.test.manytomany.web;
package com.jeeplus.modules.warehouse.storage.web;
import java.util.List;
import java.util.Map;
......@@ -32,115 +32,115 @@ import com.jeeplus.core.web.BaseController;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.common.utils.excel.ExportExcel;
import com.jeeplus.common.utils.excel.ImportExcel;
import com.jeeplus.modules.test.manytomany.entity.Course;
import com.jeeplus.modules.test.manytomany.service.CourseService;
import com.jeeplus.modules.warehouse.storage.entity.Storage;
import com.jeeplus.modules.warehouse.storage.service.StorageService;
/**
* 课程Controller
* @author lgf
* @version 2018-06-12
* 入库信息Controller
* @author huyi
* @version 2023-02-13
*/
@Controller
@RequestMapping(value = "${adminPath}/test/manytomany/course")
public class CourseController extends BaseController {
@RequestMapping(value = "${adminPath}/warehouse/storage/storage")
public class StorageController extends BaseController {
@Autowired
private CourseService courseService;
private StorageService storageService;
@ModelAttribute
public Course get(@RequestParam(required=false) String id) {
Course entity = null;
public Storage get(@RequestParam(required=false) String id) {
Storage entity = null;
if (StringUtils.isNotBlank(id)){
entity = courseService.get(id);
entity = storageService.get(id);
}
if (entity == null){
entity = new Course();
entity = new Storage();
}
return entity;
}
/**
* 课程列表页面
* 入库信息列表页面
*/
@RequiresPermissions("test:manytomany:course:list")
@RequiresPermissions("warehouse:storage:storage:list")
@RequestMapping(value = {"list", ""})
public String list(Course course, Model model) {
model.addAttribute("course", course);
return "modules/test/manytomany/courseList";
public String list(Storage storage, Model model) {
model.addAttribute("storage", storage);
return "modules/warehouse/storage/storageList";
}
/**
* 课程列表数据
* 入库信息列表数据
*/
@ResponseBody
@RequiresPermissions("test:manytomany:course:list")
@RequiresPermissions("warehouse:storage:storage:list")
@RequestMapping(value = "data")
public Map<String, Object> data(Course course, HttpServletRequest request, HttpServletResponse response, Model model) {
Page<Course> page = courseService.findPage(new Page<Course>(request, response), course);
public Map<String, Object> data(Storage storage, HttpServletRequest request, HttpServletResponse response, Model model) {
Page<Storage> page = storageService.findPage(new Page<Storage>(request, response), storage);
return getBootstrapData(page);
}
/**
* 查看,增加,编辑课程表单页面
* 查看,增加,编辑入库信息表单页面
*/
@RequiresPermissions(value={"test:manytomany:course:view","test:manytomany:course:add","test:manytomany:course:edit"},logical=Logical.OR)
@RequiresPermissions(value={"warehouse:storage:storage:view","warehouse:storage:storage:add","warehouse:storage:storage:edit"},logical=Logical.OR)
@RequestMapping(value = "form/{mode}")
public String form(@PathVariable String mode, Course course, Model model) {
model.addAttribute("course", course);
public String form(@PathVariable String mode, Storage storage, Model model) {
model.addAttribute("storage", storage);
model.addAttribute("mode", mode);
return "modules/test/manytomany/courseForm";
return "modules/warehouse/storage/storageForm";
}
/**
* 保存课程
* 保存入库信息
*/
@ResponseBody
@RequiresPermissions(value={"test:manytomany:course:add","test:manytomany:course:edit"},logical=Logical.OR)
@RequiresPermissions(value={"warehouse:storage:storage:add","warehouse:storage:storage:edit"},logical=Logical.OR)
@RequestMapping(value = "save")
public AjaxJson save(Course course, Model model) throws Exception{
public AjaxJson save(Storage storage, Model model) throws Exception{
AjaxJson j = new AjaxJson();
/**
* 后台hibernate-validation插件校验
*/
String errMsg = beanValidator(course);
String errMsg = beanValidator(storage);
if (StringUtils.isNotBlank(errMsg)){
j.setSuccess(false);
j.setMsg(errMsg);
return j;
}
//新增或编辑表单保存
courseService.save(course);//保存
storageService.save(storage);//保存
j.setSuccess(true);
j.setMsg("保存课程成功");
j.setMsg("保存入库信息成功");
return j;
}
/**
* 删除课程
* 删除入库信息
*/
@ResponseBody
@RequiresPermissions("test:manytomany:course:del")
@RequiresPermissions("warehouse:storage:storage:del")
@RequestMapping(value = "delete")
public AjaxJson delete(Course course) {
public AjaxJson delete(Storage storage) {
AjaxJson j = new AjaxJson();
courseService.delete(course);
j.setMsg("删除课程成功");
storageService.delete(storage);
j.setMsg("删除入库信息成功");
return j;
}
/**
* 批量删除课程
* 批量删除入库信息
*/
@ResponseBody
@RequiresPermissions("test:manytomany:course:del")
@RequiresPermissions("warehouse:storage:storage:del")
@RequestMapping(value = "deleteAll")
public AjaxJson deleteAll(String ids) {
AjaxJson j = new AjaxJson();
String idArray[] =ids.split(",");
for(String id : idArray){
courseService.delete(courseService.get(id));
storageService.delete(storageService.get(id));
}
j.setMsg("删除课程成功");
j.setMsg("删除入库信息成功");
return j;
}
......@@ -148,30 +148,37 @@ public class CourseController extends BaseController {
* 导出excel文件
*/
@ResponseBody
@RequiresPermissions("test:manytomany:course:export")
@RequiresPermissions("warehouse:storage:storage:export")
@RequestMapping(value = "export")
public AjaxJson exportFile(Course course, HttpServletRequest request, HttpServletResponse response) {
public AjaxJson exportFile(Storage storage, HttpServletRequest request, HttpServletResponse response) {
AjaxJson j = new AjaxJson();
try {
String fileName = "课程"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
Page<Course> page = courseService.findPage(new Page<Course>(request, response, -1), course);
new ExportExcel("课程", Course.class).setDataList(page.getList()).write(response, fileName).dispose();
String fileName = "入库信息"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
Page<Storage> page = storageService.findPage(new Page<Storage>(request, response, -1), storage);
new ExportExcel("入库信息", Storage.class).setDataList(page.getList()).write(response, fileName).dispose();
j.setSuccess(true);
j.setMsg("导出成功!");
return j;
} catch (Exception e) {
j.setSuccess(false);
j.setMsg("导出课程记录失败!失败信息:"+e.getMessage());
j.setMsg("导出入库信息记录失败!失败信息:"+e.getMessage());
}
return j;
}
@ResponseBody
@RequestMapping(value = "detail")
public Storage detail(String id) {
return storageService.get(id);
}
/**
* 导入Excel数据
*/
@ResponseBody
@RequiresPermissions("test:manytomany:course:import")
@RequiresPermissions("warehouse:storage:storage:import")
@RequestMapping(value = "import")
public AjaxJson importFile(@RequestParam("file")MultipartFile file, HttpServletResponse response, HttpServletRequest request) {
AjaxJson j = new AjaxJson();
......@@ -180,10 +187,10 @@ public class CourseController extends BaseController {
int failureNum = 0;
StringBuilder failureMsg = new StringBuilder();
ImportExcel ei = new ImportExcel(file, 1, 0);
List<Course> list = ei.getDataList(Course.class);
for (Course course : list){
List<Storage> list = ei.getDataList(Storage.class);
for (Storage storage : list){
try{
courseService.save(course);
storageService.save(storage);
successNum++;
}catch(ConstraintViolationException ex){
failureNum++;
......@@ -192,28 +199,28 @@ public class CourseController extends BaseController {
}
}
if (failureNum>0){
failureMsg.insert(0, ",失败 "+failureNum+" 条课程记录。");
failureMsg.insert(0, ",失败 "+failureNum+" 条入库信息记录。");
}
j.setMsg( "已成功导入 "+successNum+" 条课程记录"+failureMsg);
j.setMsg( "已成功导入 "+successNum+" 条入库信息记录"+failureMsg);
} catch (Exception e) {
j.setSuccess(false);
j.setMsg("导入课程失败!失败信息:"+e.getMessage());
j.setMsg("导入入库信息失败!失败信息:"+e.getMessage());
}
return j;
}
/**
* 下载导入课程数据模板
* 下载导入入库信息数据模板
*/
@ResponseBody
@RequiresPermissions("test:manytomany:course:import")
@RequiresPermissions("warehouse:storage:storage:import")
@RequestMapping(value = "import/template")
public AjaxJson importFileTemplate(HttpServletResponse response) {
AjaxJson j = new AjaxJson();
try {
String fileName = "课程数据导入模板.xlsx";
List<Course> list = Lists.newArrayList();
new ExportExcel("课程数据", Course.class, 1).setDataList(list).write(response, fileName).dispose();
String fileName = "入库信息数据导入模板.xlsx";
List<Storage> list = Lists.newArrayList();
new ExportExcel("入库信息数据", Storage.class, 1).setDataList(list).write(response, fileName).dispose();
return null;
} catch (Exception e) {
j.setSuccess(false);
......@@ -221,5 +228,6 @@ public class CourseController extends BaseController {
}
return j;
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment