From 2bd1d9982d3eb10ec16a7026a16115017d1a4d65 Mon Sep 17 00:00:00 2001 From: cjl Date: Wed, 23 Jan 2019 13:58:53 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8F=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- erp_web/pages/manage/serialNumber.html | 453 ++++++++++++++++++ erp_web/pages/materials/material.html | 25 +- pom.xml | 6 + sql/jsh_erp.sql | 20 + sql/华夏ERP数据库设计汇总.xlsx | Bin 70619 -> 72656 bytes src/main/java/com/jsh/erp/ErpApplication.java | 5 + .../jsh/erp/constants/BusinessConstants.java | 29 ++ .../jsh/erp/constants/ExceptionConstants.java | 61 +++ .../controller/SerialNumberController.java | 106 ++++ .../jsh/erp/datasource/entities/Material.java | 13 + .../datasource/entities/MaterialVo4Unit.java | 13 + .../datasource/entities/SerialNumberEx.java | 46 ++ .../datasource/mappers/MaterialMapper.java | 30 -- .../datasource/mappers/MaterialMapperEx.java | 53 ++ .../mappers/SerialNumberMapperEx.java | 40 ++ .../BusinessParamCheckingException.java | 25 + .../exception/BusinessRunTimeException.java | 25 + .../erp/exception/GlobalExceptionHandler.java | 41 ++ .../erp/service/material/MaterialService.java | 19 +- .../serialNumber/SerialNumberComponent.java | 77 +++ .../serialNumber/SerialNumberResource.java | 18 + .../serialNumber/SerialNumberService.java | 235 +++++++++ .../java/com/jsh/erp/utils/JsonUtils.java | 43 +- .../java/com/jsh/erp/utils/StringUtil.java | 432 ++++++++--------- src/main/resources/application.properties | 2 + .../resources/mapper_xml/MaterialMapper.xml | 21 +- .../resources/mapper_xml/MaterialMapperEx.xml | 43 +- .../mapper_xml/SerialNumberMapperEx.xml | 116 +++++ src/test/resources/generatorConfig.xml | 137 +++--- 29 files changed, 1787 insertions(+), 347 deletions(-) create mode 100644 erp_web/pages/manage/serialNumber.html create mode 100644 src/main/java/com/jsh/erp/constants/BusinessConstants.java create mode 100644 src/main/java/com/jsh/erp/constants/ExceptionConstants.java create mode 100644 src/main/java/com/jsh/erp/controller/SerialNumberController.java create mode 100644 src/main/java/com/jsh/erp/datasource/entities/SerialNumberEx.java create mode 100644 src/main/java/com/jsh/erp/datasource/mappers/MaterialMapperEx.java create mode 100644 src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java create mode 100644 src/main/java/com/jsh/erp/exception/BusinessParamCheckingException.java create mode 100644 src/main/java/com/jsh/erp/exception/BusinessRunTimeException.java create mode 100644 src/main/java/com/jsh/erp/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/jsh/erp/service/serialNumber/SerialNumberComponent.java create mode 100644 src/main/java/com/jsh/erp/service/serialNumber/SerialNumberResource.java create mode 100644 src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java create mode 100644 src/main/resources/mapper_xml/SerialNumberMapperEx.xml diff --git a/erp_web/pages/manage/serialNumber.html b/erp_web/pages/manage/serialNumber.html new file mode 100644 index 00000000..0c95b92e --- /dev/null +++ b/erp_web/pages/manage/serialNumber.html @@ -0,0 +1,453 @@ + + + + 序列号 + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
商品名称: + +  序列号: + +   + 查询   + 重置 +
+
+ + +
+
+
+ +
+
+
+ +
+
+
+
+ + + + + + + + + + + + + +
商品名称 + + + 序列号 + + +
备注 + +
+
+
+
+
+ +
+ 保存 + 取消 +
+ + + + + diff --git a/erp_web/pages/materials/material.html b/erp_web/pages/materials/material.html index b211997d..ae5112cb 100644 --- a/erp_web/pages/materials/material.html +++ b/erp_web/pages/materials/material.html @@ -90,6 +90,16 @@ + + 序列号 + + + + + 备注 @@ -611,7 +621,7 @@ + 'AaBb' + rec.lowprice + 'AaBb' + rec.presetpriceone + 'AaBb' + rec.presetpricetwo + 'AaBb' + rec.remark + 'AaBb' + rec.standard + 'AaBb' + rec.color + 'AaBb' + rec.packing + 'AaBb' + rec.safetystock + 'AaBb' + rec.categoryid + 'AaBb' + rec.categoryName + 'AaBb' + rec.unitid + 'AaBb' + rec.unitName + 'AaBb' + rec.firstoutunit + 'AaBb' + rec.firstinunit - + 'AaBb' + rec.mfrs + 'AaBb' + rec.otherfield1 + 'AaBb' + rec.otherfield2 + 'AaBb' + rec.otherfield3; + + 'AaBb' + rec.mfrs + 'AaBb' + rec.otherfield1 + 'AaBb' + rec.otherfield2 + 'AaBb' + rec.otherfield3+ 'AaBb' + rec.enableSerialNumber; str += '   '; str += ''; return str; @@ -671,6 +681,11 @@ title: '状态', field: 'enabled', width: 50, align: "center", formatter: function (value) { return value ? "启用" : "禁用"; } + }, + { + title: '序列号', field: 'enableSerialNumber', width: 70, align: "center", formatter: function (value) { + return value ? "启用" : "禁用"; + } } ]], toolbar: [ @@ -1145,7 +1160,7 @@ $('#materialFM input').val(""); //将输入框全部清空 bindMProperty(); //根据商品属性绑定 - + $("#enableSerialNumber").combobox('setValue','0'); $('#materialDlg').dialog('open').dialog('setTitle', ' 增加商品信息'); $(".window-mask").css({width: webW, height: webH}); $("#Name").val("").focus(); @@ -1271,11 +1286,13 @@ basicList.LowPrice = $("#basicLowPrice").val(); basicList.PresetPriceOne = $("#basicPresetPriceOne").val(); basicList.PresetPriceTwo = $("#basicPresetPriceTwo").val(); + basicList.enableSerialNumber=$("#enableSerialNumber").combobox('getValue'); otherList.Unit = $("#otherUnit").text(); otherList.RetailPrice = $("#otherRetailPrice").val(); otherList.LowPrice = $("#otherLowPrice").val(); otherList.PresetPriceOne = $("#otherPresetPriceOne").val(); otherList.PresetPriceTwo = $("#otherPresetPriceTwo").val(); + var basic = {}; var other = {}; basic.basic = basicList; @@ -1341,6 +1358,10 @@ $("#Name").focus().val(materialInfo[1]); $("#Color").focus().val(materialInfo[11]); + // console.log("enableSerialNumber:"+(materialInfo[24]=='true'?'1':'0')); + // console.log("enableSerialNumber:"+materialInfo[24]); + $("#enableSerialNumber").combobox('setValue',materialInfo[24]=='true'?'1':'0'); + // console.log($("#enableSerialNumber").val()); var categoryName = ""; //类型名称 mId = materialInfo[14]; diff --git a/pom.xml b/pom.xml index 829f3b70..7f1e9547 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,12 @@ jxl 2.6.3 + + + org.projectlombok + lombok + 1.16.12 + diff --git a/sql/jsh_erp.sql b/sql/jsh_erp.sql index 88922e6e..d57a9b96 100644 --- a/sql/jsh_erp.sql +++ b/sql/jsh_erp.sql @@ -5179,3 +5179,23 @@ INSERT INTO `jsh_userbusiness` VALUES ('24', 'UserDepot', '65', '[1]', null); INSERT INTO `jsh_userbusiness` VALUES ('25', 'UserCustomer', '64', '[5][2]', null); INSERT INTO `jsh_userbusiness` VALUES ('26', 'UserCustomer', '65', '[6]', null); INSERT INTO `jsh_userbusiness` VALUES ('27', 'UserCustomer', '63', '[5][2]', null); + +--添加序列号表 +DROP TABLE IF EXISTS `jsh_serial_number`; +CREATE TABLE `jsh_serial_number` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `material_Id` bigint(20) DEFAULT NULL COMMENT '产品表id', + `serial_Number` varchar(64) DEFAULT NULL COMMENT '序列号', + `is_Sell` bit(1) DEFAULT 0 COMMENT '是否卖出,0未卖出,1卖出', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + `delete_Flag` bit(1) DEFAULT 0 COMMENT '删除标记,0未删除,1删除', + `create_Time` datetime DEFAULT NULL COMMENT '创建时间', + `creator` bigint(20) DEFAULT NULL COMMENT '创建人', + `update_Time` datetime DEFAULT NULL COMMENT '更新时间', + `updater` bigint(20) DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`Id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='序列号表'; + +--产品表新增字段是否启用序列号 +alter table jsh_material add enableSerialNumber bit(1) DEFAULT 0 COMMENT '是否开启序列号,0否,1是'; + diff --git a/sql/华夏ERP数据库设计汇总.xlsx b/sql/华夏ERP数据库设计汇总.xlsx index 848bffaea4cf12712e3f93af2bda4f1e8f85d174..f13a512e697b368bf3e93539197ef7fa738b0145 100644 GIT binary patch delta 59623 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�CTZ&a|@_PH0< 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ⅈRVg00cuYs=DfSWad?)oEgLy(It2@v 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 selectByConditionMaterial( - @Param("name") String name, - @Param("model") String model, - @Param("categoryId") Long categoryId, - @Param("categoryIds") String categoryIds, - @Param("mpList") String mpList, - @Param("offset") Integer offset, - @Param("rows") Integer rows); - int countsByMaterial( - @Param("name") String name, - @Param("model") String model, - @Param("categoryId") Long categoryId, - @Param("categoryIds") String categoryIds, - @Param("mpList") String mpList); - - String findUnitName(@Param("mId") Long mId); - - List findById(@Param("id") Long id); - - List findBySelect(); - - int updatePriceNullByPrimaryKey(Long id); - - int updateUnitIdNullByPrimaryKey(Long id); - - List findByAll( - @Param("name") String name, - @Param("model") String model, - @Param("categoryId") Long categoryId, - @Param("categoryIds") String categoryIds); } \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/datasource/mappers/MaterialMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/MaterialMapperEx.java new file mode 100644 index 00000000..eae6bf8d --- /dev/null +++ b/src/main/java/com/jsh/erp/datasource/mappers/MaterialMapperEx.java @@ -0,0 +1,53 @@ +package com.jsh.erp.datasource.mappers; + +import com.jsh.erp.datasource.entities.Material; +import com.jsh.erp.datasource.entities.MaterialVo4Unit; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Description + * + * @Author: cjl + * @Date: 2019/1/22 14:54 + */ +public interface MaterialMapperEx { + + List selectByConditionMaterial( + @Param("name") String name, + @Param("model") String model, + @Param("categoryId") Long categoryId, + @Param("categoryIds") String categoryIds, + @Param("mpList") String mpList, + @Param("offset") Integer offset, + @Param("rows") Integer rows); + + int countsByMaterial( + @Param("name") String name, + @Param("model") String model, + @Param("categoryId") Long categoryId, + @Param("categoryIds") String categoryIds, + @Param("mpList") String mpList); + + String findUnitName(@Param("mId") Long mId); + + List findById(@Param("id") Long id); + + List findBySelect(); + + int updatePriceNullByPrimaryKey(Long id); + + int updateUnitIdNullByPrimaryKey(Long id); + + List findByAll( + @Param("name") String name, + @Param("model") String model, + @Param("categoryId") Long categoryId, + @Param("categoryIds") String categoryIds); + /** + * 通过商品名称查询商品信息 + * */ + List findByMaterialName(@Param("name") String name); + +} diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java new file mode 100644 index 00000000..686970eb --- /dev/null +++ b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapperEx.java @@ -0,0 +1,40 @@ +package com.jsh.erp.datasource.mappers; + +import com.jsh.erp.datasource.entities.SerialNumber; +import com.jsh.erp.datasource.entities.SerialNumberEx; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Description + * + * @Author: cjl + * @Date: 2019/1/21 17:09 + */ +public interface SerialNumberMapperEx { + /** + * 根据条件查询序列号列表 + * */ + List selectByConditionSerialNumber(@Param("serialNumber") String serialNumber, @Param("materialName") String materialName,@Param("offset") Integer offset,@Param("rows") Integer rows); + /** + * 根据条件查询序列号数量 + * */ + int countSerialNumber(@Param("serialNumber")String serialNumber,@Param("materialName")String materialName); + /** + * 通过id查询序列号复合信息 + * */ + List findById(Long id); + /** + * 通过序列号查询序列号实体信息 + * */ + List findBySerialNumber(@Param("serialNumber") String serialNumber); + /** + * 新增序列号信息 + * */ + int addSerialNumber(SerialNumberEx serialNumberEx); + /** + * 修改序列号信息 + * */ + int updateSerialNumber(SerialNumberEx serialNumberEx); +} diff --git a/src/main/java/com/jsh/erp/exception/BusinessParamCheckingException.java b/src/main/java/com/jsh/erp/exception/BusinessParamCheckingException.java new file mode 100644 index 00000000..ac5ebdc3 --- /dev/null +++ b/src/main/java/com/jsh/erp/exception/BusinessParamCheckingException.java @@ -0,0 +1,25 @@ +package com.jsh.erp.exception; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Getter +public class BusinessParamCheckingException extends Exception { + + private static final long serialVersionUID = 1L; + private int code; + private String reason; + + public BusinessParamCheckingException(int code, String reason) { + super(reason); + this.code = code; + this.reason = reason; + } + + public BusinessParamCheckingException(int code, String reason, Throwable throwable) { + super(reason, throwable); + this.code = code; + this.reason = reason; + } +} diff --git a/src/main/java/com/jsh/erp/exception/BusinessRunTimeException.java b/src/main/java/com/jsh/erp/exception/BusinessRunTimeException.java new file mode 100644 index 00000000..efd81282 --- /dev/null +++ b/src/main/java/com/jsh/erp/exception/BusinessRunTimeException.java @@ -0,0 +1,25 @@ +package com.jsh.erp.exception; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Getter +public class BusinessRunTimeException extends RuntimeException { + + private static final long serialVersionUID = 1L; + private int code; + private String reason; + + public BusinessRunTimeException(int code, String reason) { + super(reason); + this.code = code; + this.reason = reason; + } + + public BusinessRunTimeException(int code, String reason, Throwable throwable) { + super(reason, throwable); + this.code = code; + this.reason = reason; + } +} diff --git a/src/main/java/com/jsh/erp/exception/GlobalExceptionHandler.java b/src/main/java/com/jsh/erp/exception/GlobalExceptionHandler.java new file mode 100644 index 00000000..46765fe6 --- /dev/null +++ b/src/main/java/com/jsh/erp/exception/GlobalExceptionHandler.java @@ -0,0 +1,41 @@ +package com.jsh.erp.exception; + +import com.alibaba.fastjson.JSONObject; +import com.jsh.erp.constants.ExceptionConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; + +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(value = Exception.class) + @ResponseBody + public Object handleException(Exception e, HttpServletRequest request) { + JSONObject status = new JSONObject(); + + // 针对业务参数异常的处理 + if (e instanceof BusinessParamCheckingException) { + status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, ((BusinessParamCheckingException) e).getCode()); + status.put(ExceptionConstants.GLOBAL_RETURNS_MESSAGE, ((BusinessParamCheckingException) e).getReason()); + return status; + } + + //针对业务运行时异常的处理 + if (e instanceof BusinessRunTimeException) { + status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, ((BusinessRunTimeException) e).getCode()); + status.put(ExceptionConstants.GLOBAL_RETURNS_MESSAGE, ((BusinessRunTimeException) e).getReason()); + return status; + } + + status.put(ExceptionConstants.GLOBAL_RETURNS_CODE, ExceptionConstants.SERVICE_SYSTEM_ERROR_CODE); + status.put(ExceptionConstants.GLOBAL_RETURNS_MESSAGE, ExceptionConstants.SERVICE_SYSTEM_ERROR_MSG); + log.error("Global Exception Occured => url : {}, msg : {}", request.getRequestURL(), e.getMessage()); + e.printStackTrace(); + return status; + } +} \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/service/material/MaterialService.java b/src/main/java/com/jsh/erp/service/material/MaterialService.java index 45c8f4b8..ab9e44a3 100644 --- a/src/main/java/com/jsh/erp/service/material/MaterialService.java +++ b/src/main/java/com/jsh/erp/service/material/MaterialService.java @@ -5,6 +5,7 @@ import com.jsh.erp.datasource.entities.Material; import com.jsh.erp.datasource.entities.MaterialExample; import com.jsh.erp.datasource.entities.MaterialVo4Unit; import com.jsh.erp.datasource.mappers.MaterialMapper; +import com.jsh.erp.datasource.mappers.MaterialMapperEx; import com.jsh.erp.utils.BaseResponseInfo; import com.jsh.erp.utils.StringUtil; import org.slf4j.Logger; @@ -25,6 +26,8 @@ public class MaterialService { @Resource private MaterialMapper materialMapper; + @Resource + private MaterialMapperEx materialMapperEx; public Material getMaterial(long id) { return materialMapper.selectByPrimaryKey(id); @@ -38,7 +41,7 @@ public class MaterialService { public List select(String name, String model,Long categoryId, String categoryIds,String mpList, int offset, int rows) { String[] mpArr = mpList.split(","); List resList = new ArrayList(); - List list = materialMapper.selectByConditionMaterial(name, model,categoryId,categoryIds,mpList, offset, rows); + List list = materialMapperEx.selectByConditionMaterial(name, model,categoryId,categoryIds,mpList, offset, rows); if (null != list) { for (MaterialVo4Unit m : list) { //扩展信息 @@ -71,7 +74,7 @@ public class MaterialService { } public int countMaterial(String name, String model,Long categoryId, String categoryIds,String mpList) { - return materialMapper.countsByMaterial(name, model,categoryId,categoryIds,mpList); + return materialMapperEx.countsByMaterial(name, model,categoryId,categoryIds,mpList); } @Transactional(value = "transactionManager", rollbackFor = Exception.class) @@ -88,9 +91,9 @@ public class MaterialService { int res = materialMapper.updateByPrimaryKeySelective(material); Long unitId = material.getUnitid(); if(unitId != null) { - materialMapper.updatePriceNullByPrimaryKey(id); //将价格置空 + materialMapperEx.updatePriceNullByPrimaryKey(id); //将价格置空 } else { - materialMapper.updateUnitIdNullByPrimaryKey(id); //将多单位置空 + materialMapperEx.updateUnitIdNullByPrimaryKey(id); //将多单位置空 } return res; } @@ -146,15 +149,15 @@ public class MaterialService { } public String findUnitName(Long mId){ - return materialMapper.findUnitName(mId); + return materialMapperEx.findUnitName(mId); } public List findById(Long id){ - return materialMapper.findById(id); + return materialMapperEx.findById(id); } public List findBySelect(){ - return materialMapper.findBySelect(); + return materialMapperEx.findBySelect(); } public List findByOrder(){ @@ -165,7 +168,7 @@ public class MaterialService { public List findByAll(String name, String model, Long categoryId, String categoryIds) { List resList = new ArrayList(); - List list = materialMapper.findByAll(name, model, categoryId, categoryIds); + List list = materialMapperEx.findByAll(name, model, categoryId, categoryIds); if (null != list) { for (MaterialVo4Unit m : list) { resList.add(m); diff --git a/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberComponent.java b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberComponent.java new file mode 100644 index 00000000..a3176e0e --- /dev/null +++ b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberComponent.java @@ -0,0 +1,77 @@ +package com.jsh.erp.service.serialNumber; + +import com.jsh.erp.service.ICommonQuery; +import com.jsh.erp.service.material.MaterialResource; +import com.jsh.erp.service.material.MaterialService; +import com.jsh.erp.utils.Constants; +import com.jsh.erp.utils.QueryUtils; +import com.jsh.erp.utils.StringUtil; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** + * Description + * + * @Author: cjl + * @Date: 2019/1/21 16:33 + */ +@Service(value = "serialNumber_component") +@SerialNumberResource +public class SerialNumberComponent implements ICommonQuery { + @Resource + private SerialNumberService serialNumberService; + + @Override + public Object selectOne(String condition) { + return null; + } + + @Override + public List select(Map map) { + return getSerialNumberList(map); + } + + private List getSerialNumberList(Map map) { + String search = map.get(Constants.SEARCH); + String serialNumber = StringUtil.getInfo(search, "serialNumber"); + String materialName = StringUtil.getInfo(search, "materialName"); + return serialNumberService.select(serialNumber,materialName,QueryUtils.offset(map), QueryUtils.rows(map)); + } + + @Override + public int counts(Map map) { + String search = map.get(Constants.SEARCH); + String serialNumber = StringUtil.getInfo(search, "serialNumber"); + String materialName = StringUtil.getInfo(search, "materialName"); + return serialNumberService.countSerialNumber(serialNumber, materialName); + } + + @Override + public int insert(String beanJson, HttpServletRequest request) { + return serialNumberService.insertSerialNumber(beanJson, request); + } + + @Override + public int update(String beanJson, Long id) { + return serialNumberService.updateSerialNumber(beanJson, id); + } + + @Override + public int delete(Long id) { + return serialNumberService.deleteSerialNumber(id); + } + + @Override + public int batchDelete(String ids) { + return serialNumberService.batchDeleteSerialNumber(ids); + } + + @Override + public int checkIsNameExist(Long id, String serialNumber) { + return serialNumberService.checkIsNameExist(id, serialNumber); + } +} diff --git a/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberResource.java b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberResource.java new file mode 100644 index 00000000..6da53819 --- /dev/null +++ b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberResource.java @@ -0,0 +1,18 @@ +package com.jsh.erp.service.serialNumber; + +import com.jsh.erp.service.ResourceInfo; + +import java.lang.annotation.*; + +/** + * Description + * + * @Author: cjl + * @Date: 2019/1/21 16:33 + */ +@ResourceInfo(value = "serialNumber", type = 105) +@Inherited +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface SerialNumberResource { +} diff --git a/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java new file mode 100644 index 00000000..e893c08e --- /dev/null +++ b/src/main/java/com/jsh/erp/service/serialNumber/SerialNumberService.java @@ -0,0 +1,235 @@ +package com.jsh.erp.service.serialNumber; + +import com.alibaba.fastjson.JSONObject; +import com.jsh.erp.constants.ExceptionConstants; +import com.jsh.erp.datasource.entities.*; +import com.jsh.erp.datasource.mappers.MaterialMapperEx; +import com.jsh.erp.datasource.mappers.SerialNumberMapper; +import com.jsh.erp.datasource.mappers.SerialNumberMapperEx; +import com.jsh.erp.exception.BusinessRunTimeException; +import com.jsh.erp.service.material.MaterialService; +import com.jsh.erp.utils.StringUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * Description + * + * @Author: cjl + * @Date: 2019/1/21 16:33 + */ +@Service +public class SerialNumberService { + private Logger logger = LoggerFactory.getLogger(MaterialService.class); + + @Resource + private SerialNumberMapper serialNumberMapper; + @Resource + private SerialNumberMapperEx serialNumberMapperEx; + @Resource + private MaterialMapperEx materialMapperEx; + + + public SerialNumber getSerialNumber(long id) { + return serialNumberMapper.selectByPrimaryKey(id); + } + + public List getSerialNumber() { + SerialNumberExample example = new SerialNumberExample(); + return serialNumberMapper.selectByExample(example); + } + + public List select(String serialNumber, String materialName, Integer offset, Integer rows) { + return serialNumberMapperEx.selectByConditionSerialNumber(serialNumber, materialName,offset, rows); + + } + + public int countSerialNumber(String serialNumber,String materialName) { + return serialNumberMapperEx.countSerialNumber(serialNumber, materialName); + } + + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public int insertSerialNumber(String beanJson, HttpServletRequest request) { + SerialNumber serialNumber = JSONObject.parseObject(beanJson, SerialNumber.class); + return serialNumberMapper.insertSelective(serialNumber); + } + + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public int updateSerialNumber(String beanJson, Long id) { + SerialNumber serialNumber = JSONObject.parseObject(beanJson, SerialNumber.class); + serialNumber.setId(id); + int res = serialNumberMapper.updateByPrimaryKeySelective(serialNumber); + return res; + } + + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public int deleteSerialNumber(Long id) { + return serialNumberMapper.deleteByPrimaryKey(id); + } + + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public int batchDeleteSerialNumber(String ids) { + List idList = StringUtil.strToLongList(ids); + SerialNumberExample example = new SerialNumberExample(); + example.createCriteria().andIdIn(idList); + return serialNumberMapper.deleteByExample(example); + } + + public int checkIsNameExist(Long id, String serialNumber) { + SerialNumberExample example = new SerialNumberExample(); + example.createCriteria().andIdNotEqualTo(id).andSerialNumberEqualTo(serialNumber); + List list = serialNumberMapper.selectByExample(example); + return list.size(); + } + + + + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public int batchSetEnable(Boolean enabled, String materialIDs) { + List ids = StringUtil.strToLongList(materialIDs); + SerialNumber serialNumber = new SerialNumber(); + SerialNumberExample example = new SerialNumberExample(); + example.createCriteria().andIdIn(ids); + return serialNumberMapper.updateByExampleSelective(serialNumber, example); + } + + + public List findById(Long id){ + return serialNumberMapperEx.findById(id); + } + + + + + public void checkIsExist(Long id, String materialName, String serialNumber) { + /** + * 商品名称不为空时,检查商品名称是否存在 + * */ + if(StringUtil.isNotEmpty(materialName)){ + List mlist = materialMapperEx.findByMaterialName(materialName); + if(mlist==null||mlist.size()<1){ + //商品名称不存在 + throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_EXISTS_CODE, + ExceptionConstants.MATERIAL_NOT_EXISTS__MSG); + }else if(mlist.size()>1){ + //商品信息不唯一 + throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_ONLY_CODE, + ExceptionConstants.MATERIAL_NOT_ONLY__MSG); + + } + } + /*** + * 判断序列号是否已存在 + * */ + List list = serialNumberMapperEx.findBySerialNumber(serialNumber); + if(list!=null&&list.size()>0){ + if(list.size()>1){ + //存在多个同名序列号 + throw new BusinessRunTimeException(ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_CODE, + ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_MSG); + }else{ + //存在一个序列号 + if(id==null){ + //新增,存在要添加的序列号 + throw new BusinessRunTimeException(ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_CODE, + ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_MSG); + } + if(id.equals(list.get(0).getId())){ + //修改的是同一条数据 + }else{ + //存在一条不同的序列号信息 + throw new BusinessRunTimeException(ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_CODE, + ExceptionConstants.SERIAL_NUMBERE_ALREADY_EXISTS_MSG); + } + } + + } + } + + /** + * 新增序列号信息 + * */ + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public SerialNumberEx addSerialNumber(SerialNumberEx serialNumberEx) { + if(serialNumberEx==null){ + return null; + } + /**处理商品id*/ + if(serialNumberEx.getMaterialId()==null){ + if(StringUtil.isNotEmpty(serialNumberEx.getMaterialName())){ + List mlist = materialMapperEx.findByMaterialName(serialNumberEx.getMaterialName()); + if(mlist==null||mlist.size()<1){ + //商品名称不存在 + throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_EXISTS_CODE, + ExceptionConstants.MATERIAL_NOT_EXISTS__MSG); + }else if(mlist.size()>1){ + //商品信息不唯一 + throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_ONLY_CODE, + ExceptionConstants.MATERIAL_NOT_ONLY__MSG); + + }else{ + serialNumberEx.setMaterialId(mlist.get(0).getId()); + } + } + } + //删除标记,默认未删除 + serialNumberEx.setDeleteFlag(false); + //已卖出,默认未否 + serialNumberEx.setIsSell(false); + Date date=new Date(); + serialNumberEx.setCreateTime(date); + serialNumberEx.setUpdateTime(date); + HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + User userInfo=(User)request.getSession().getAttribute("user"); + serialNumberEx.setCreator(userInfo==null?null:userInfo.getId()); + serialNumberEx.setUpdater(userInfo==null?null:userInfo.getId()); + int result=serialNumberMapperEx.addSerialNumber(serialNumberEx); + if(result==1){ + return serialNumberEx; + } + return null; + } + @Transactional(value = "transactionManager", rollbackFor = Exception.class) + public SerialNumberEx updateSerialNumber(SerialNumberEx serialNumberEx) { + if(serialNumberEx==null){ + return null; + } + /**处理商品id*/ + if(StringUtil.isNotEmpty(serialNumberEx.getMaterialName())){ + List mlist = materialMapperEx.findByMaterialName(serialNumberEx.getMaterialName()); + if(mlist==null||mlist.size()<1){ + //商品名称不存在 + throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_EXISTS_CODE, + ExceptionConstants.MATERIAL_NOT_EXISTS__MSG); + }else if(mlist.size()>1){ + //商品信息不唯一 + throw new BusinessRunTimeException(ExceptionConstants.MATERIAL_NOT_ONLY_CODE, + ExceptionConstants.MATERIAL_NOT_ONLY__MSG); + + }else{ + serialNumberEx.setMaterialId(mlist.get(0).getId()); + } + } + Date date=new Date(); + serialNumberEx.setUpdateTime(date); + HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + User userInfo=(User)request.getSession().getAttribute("user"); + serialNumberEx.setUpdater(userInfo==null?null:userInfo.getId()); + int result = serialNumberMapperEx.updateSerialNumber(serialNumberEx); + if(result==1){ + return serialNumberEx; + } + return null; + } +} diff --git a/src/main/java/com/jsh/erp/utils/JsonUtils.java b/src/main/java/com/jsh/erp/utils/JsonUtils.java index d990ccb2..131684cf 100644 --- a/src/main/java/com/jsh/erp/utils/JsonUtils.java +++ b/src/main/java/com/jsh/erp/utils/JsonUtils.java @@ -1,21 +1,22 @@ -package com.jsh.erp.utils; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -/** - * Created by jishenghua 2018-5-11 09:48:08 - * - * @author jishenghua - */ -public class JsonUtils { - - public static JSONObject ok(){ - JSONObject obj = new JSONObject(); - JSONObject tmp = new JSONObject(); - tmp.put("message", "成功"); - obj.put("code", 200); - obj.put("data", tmp); - return obj; - } -} +package com.jsh.erp.utils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * Created by jishenghua 2018-5-11 09:48:08 + * + * @author jishenghua + */ +public class JsonUtils { + + public static JSONObject ok(){ + JSONObject obj = new JSONObject(); + JSONObject tmp = new JSONObject(); + tmp.put("message", "成功"); + obj.put("code", 200); + obj.put("data", tmp); + return obj; + } + +} diff --git a/src/main/java/com/jsh/erp/utils/StringUtil.java b/src/main/java/com/jsh/erp/utils/StringUtil.java index 7321449f..6c44e68a 100644 --- a/src/main/java/com/jsh/erp/utils/StringUtil.java +++ b/src/main/java/com/jsh/erp/utils/StringUtil.java @@ -1,214 +1,218 @@ -package com.jsh.erp.utils; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; - -/** - * @author jishenghua qq752718920 2018-10-7 15:26:27 - */ -public class StringUtil { - - private StringUtil() { - - } - - private static String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss"; - - public static String filterNull(String str) { - if (str == null) { - return ""; - } else { - return str.trim(); - } - } - - public static boolean stringEquels(String source,String target) { - if(isEmpty(source)||isEmpty(target)){ - return false; - }else{ - return source.equals(target); - } - } - - public static boolean isEmpty(String str) { - return str == null || "".equals(str.trim()); - } - - public static boolean isNotEmpty(String str) { - return !isEmpty(str); - } - - public static String getSysDate(String format) { - if (StringUtil.isEmpty(format)) { - format = DEFAULT_FORMAT; - } - SimpleDateFormat df = new SimpleDateFormat(format); - return df.format(new Date()); - } - - public static Date getDateByString(String date, String format) { - if (StringUtil.isEmpty(format)) { - format = DEFAULT_FORMAT; - } - if (StringUtil.isNotEmpty(date)) { - SimpleDateFormat sdf = new SimpleDateFormat(format); - try { - return sdf.parse(date); - } catch (ParseException e) { - throw new RuntimeException("转换为日期类型错误:DATE:" + date + " FORMAT:" + format); - } - } else { - return null; - } - } - - public static Date getDateByLongDate(Long millis) { - if (millis == null) { - return new Date(); - } - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(millis); - return cal.getTime(); - - } - - public static UUID stringToUUID(String id) { - if (StringUtil.isNotEmpty(id)) { - return UUID.fromString(id); - } else { - return null; - } - } - - public static Integer parseInteger(String str) { - if (StringUtil.isNotEmpty(str)) { - return Integer.parseInt(str); - } else { - return null; - } - } - - public static List listToUUID(List listStrs) { - if (listStrs != null && listStrs.size() > 0) { - List uuidList = new ArrayList(); - for (String str : listStrs) { - uuidList.add(UUID.fromString(str)); - } - return uuidList; - } else { - return null; - } - } - - public static List arrayToUUIDList(String[] uuids) { - if (uuids != null && uuids.length > 0) { - List uuidList = new ArrayList(); - for (String str : uuids) { - uuidList.add(UUID.fromString(str)); - } - return uuidList; - } else { - return null; - } - } - - //是否是JSON - public static boolean containsAny(String str, String... flag) { - if (str != null) { - if (flag == null || flag.length == 0) { - flag = "[-{-}-]-,".split("-"); - } - for (String s : flag) { - if (str.contains(s)) { - return true; - } - } - } - return false; - } - - public static String getModifyOrgOperateData(UUID resourceId, UUID orgId) { - if (resourceId != null && orgId != null) { - Map map = new HashMap(); - map.put(resourceId, orgId); - return JSON.toJSONString(map); - } - return ""; - } - - public static String[] listToStringArray(List list) { - if (list != null && !list.isEmpty()) { - return list.toArray(new String[list.size()]); - } - return new String[0]; - } - - public static List stringToListArray(String[] strings) { - if (strings != null && strings.length > 0) { - return Arrays.asList(strings); - } - return new ArrayList(); - } - - /** - * String字符串转成List数据格式 - * String str = "1,2,3,4,5,6" -> List listLong [1,2,3,4,5,6]; - * - * @param strArr - * @return - */ - public static List strToLongList(String strArr) { - List idList=new ArrayList(); - String[] d=strArr.split(","); - for (int i = 0, size = d.length; i < size; i++) { - if(d[i]!=null) { - idList.add(Long.parseLong(d[i])); - } - } - return idList; - } - - /** - * String字符串转成List数据格式 - * String str = "1,2,3,4,5,6" -> List listLong [1,2,3,4,5,6]; - * - * @param strArr - * @return - */ - public static List strToStringList(String strArr) { - List idList=new ArrayList(); - String[] d=strArr.split(","); - for (int i = 0, size = d.length; i < size; i++) { - if(d[i]!=null) { - idList.add(d[i].toString()); - } - } - return idList; - } - - public static List searchCondition(String search) { - if (isEmpty(search)) { - return new ArrayList(); - }else{ - //String[] split = search.split(" "); - String[] split = search.split("#"); - return stringToListArray(split); - } - } - - public static String getInfo(String search, String key){ - String value = ""; - if(search!=null) { - JSONObject obj = JSONObject.parseObject(search); - value = obj.getString(key); - if(value.equals("")) { - value = null; - } - } - return value; - } -} +package com.jsh.erp.utils; + +import com.alibaba.druid.util.StringUtils; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @author jishenghua qq752718920 2018-10-7 15:26:27 + */ +public class StringUtil { + + private StringUtil() { + + } + + private static String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + public static String filterNull(String str) { + if (str == null) { + return ""; + } else { + return str.trim(); + } + } + + public static boolean stringEquels(String source,String target) { + if(isEmpty(source)||isEmpty(target)){ + return false; + }else{ + return source.equals(target); + } + } + + public static boolean isEmpty(String str) { + return str == null || "".equals(str.trim()); + } + + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + public static String getSysDate(String format) { + if (StringUtil.isEmpty(format)) { + format = DEFAULT_FORMAT; + } + SimpleDateFormat df = new SimpleDateFormat(format); + return df.format(new Date()); + } + + public static Date getDateByString(String date, String format) { + if (StringUtil.isEmpty(format)) { + format = DEFAULT_FORMAT; + } + if (StringUtil.isNotEmpty(date)) { + SimpleDateFormat sdf = new SimpleDateFormat(format); + try { + return sdf.parse(date); + } catch (ParseException e) { + throw new RuntimeException("转换为日期类型错误:DATE:" + date + " FORMAT:" + format); + } + } else { + return null; + } + } + + public static Date getDateByLongDate(Long millis) { + if (millis == null) { + return new Date(); + } + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(millis); + return cal.getTime(); + + } + + public static UUID stringToUUID(String id) { + if (StringUtil.isNotEmpty(id)) { + return UUID.fromString(id); + } else { + return null; + } + } + + public static Integer parseInteger(String str) { + if (StringUtil.isNotEmpty(str)) { + return Integer.parseInt(str); + } else { + return null; + } + } + + public static List listToUUID(List listStrs) { + if (listStrs != null && listStrs.size() > 0) { + List uuidList = new ArrayList(); + for (String str : listStrs) { + uuidList.add(UUID.fromString(str)); + } + return uuidList; + } else { + return null; + } + } + + public static List arrayToUUIDList(String[] uuids) { + if (uuids != null && uuids.length > 0) { + List uuidList = new ArrayList(); + for (String str : uuids) { + uuidList.add(UUID.fromString(str)); + } + return uuidList; + } else { + return null; + } + } + + //是否是JSON + public static boolean containsAny(String str, String... flag) { + if (str != null) { + if (flag == null || flag.length == 0) { + flag = "[-{-}-]-,".split("-"); + } + for (String s : flag) { + if (str.contains(s)) { + return true; + } + } + } + return false; + } + + public static String getModifyOrgOperateData(UUID resourceId, UUID orgId) { + if (resourceId != null && orgId != null) { + Map map = new HashMap(); + map.put(resourceId, orgId); + return JSON.toJSONString(map); + } + return ""; + } + + public static String[] listToStringArray(List list) { + if (list != null && !list.isEmpty()) { + return list.toArray(new String[list.size()]); + } + return new String[0]; + } + + public static List stringToListArray(String[] strings) { + if (strings != null && strings.length > 0) { + return Arrays.asList(strings); + } + return new ArrayList(); + } + + /** + * String字符串转成List数据格式 + * String str = "1,2,3,4,5,6" -> List listLong [1,2,3,4,5,6]; + * + * @param strArr + * @return + */ + public static List strToLongList(String strArr) { + List idList=new ArrayList(); + String[] d=strArr.split(","); + for (int i = 0, size = d.length; i < size; i++) { + if(d[i]!=null) { + idList.add(Long.parseLong(d[i])); + } + } + return idList; + } + + /** + * String字符串转成List数据格式 + * String str = "1,2,3,4,5,6" -> List listLong [1,2,3,4,5,6]; + * + * @param strArr + * @return + */ + public static List strToStringList(String strArr) { + if(StringUtils.isEmpty(strArr)){ + return null; + } + List idList=new ArrayList(); + String[] d=strArr.split(","); + for (int i = 0, size = d.length; i < size; i++) { + if(d[i]!=null) { + idList.add(d[i].toString()); + } + } + return idList; + } + + public static List searchCondition(String search) { + if (isEmpty(search)) { + return new ArrayList(); + }else{ + //String[] split = search.split(" "); + String[] split = search.split("#"); + return stringToListArray(split); + } + } + + public static String getInfo(String search, String key){ + String value = ""; + if(search!=null) { + JSONObject obj = JSONObject.parseObject(search); + value = obj.getString(key); + if(value.equals("")) { + value = null; + } + } + return value; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d6ebbd16..f3b627ad 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,6 +6,8 @@ resource=src/main/resources web.front.baseDir=erp_web mybatis.type-aliases-package=com.chinamobile.model.* mybatis.mapper-locations=classpath:./mapper_xml/*.xml +#开启sql打印 +logging.level.com.jsh.erp.datasource.mappers=DEBUG diff --git a/src/main/resources/mapper_xml/MaterialMapper.xml b/src/main/resources/mapper_xml/MaterialMapper.xml index a5fe4075..da08d931 100644 --- a/src/main/resources/mapper_xml/MaterialMapper.xml +++ b/src/main/resources/mapper_xml/MaterialMapper.xml @@ -29,6 +29,7 @@ + Id, CategoryId, Name, Mfrs, Packing, SafetyStock, Model, Standard, Color, Unit, Remark, RetailPrice, LowPrice, PresetPriceOne, PresetPriceTwo, UnitId, FirstOutUnit, FirstInUnit, - PriceStrategy, Enabled, OtherField1, OtherField2, OtherField3 + PriceStrategy, Enabled, OtherField1, OtherField2, OtherField3,enableSerialNumber + + + \ No newline at end of file diff --git a/src/main/resources/mapper_xml/SerialNumberMapperEx.xml b/src/main/resources/mapper_xml/SerialNumberMapperEx.xml new file mode 100644 index 00000000..31fc202d --- /dev/null +++ b/src/main/resources/mapper_xml/SerialNumberMapperEx.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into jsh_serial_number + (material_Id, serial_Number, is_Sell, remark,delete_Flag, + create_Time, creator,update_Time, updater) + values + (#{materialId},#{serialNumber},#{isSell},#{remark},#{deleteFlag}, + #{createTime},#{creator},#{updateTime},#{updater} + ) + + + update jsh_serial_number + + + material_Id = #{materialId,jdbcType=BIGINT}, + + + serial_Number = #{serialNumber,jdbcType=VARCHAR}, + + + is_Sell = #{isSell,jdbcType=BIT}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + delete_Flag = #{deleteFlag,jdbcType=BIT}, + + + update_Time = #{updateTime,jdbcType=TIMESTAMP}, + + + updater = #{updater,jdbcType=BIGINT}, + + + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/src/test/resources/generatorConfig.xml b/src/test/resources/generatorConfig.xml index b4b30c31..6f27c364 100644 --- a/src/test/resources/generatorConfig.xml +++ b/src/test/resources/generatorConfig.xml @@ -1,68 +1,69 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
From 309d575c5d1ecd58b5db8c96b0e23e22075b7fed Mon Sep 17 00:00:00 2001 From: cjl Date: Wed, 23 Jan 2019 14:00:46 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8F=B7=E5=9F=BA?= =?UTF-8?q?=E7=A1=80map=E5=92=8Centity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/datasource/entities/SerialNumber.java | 325 ++++++ .../entities/SerialNumberExample.java | 923 ++++++++++++++++++ .../mappers/SerialNumberMapper.java | 97 ++ .../mapper_xml/SerialNumberMapper.xml | 351 +++++++ 4 files changed, 1696 insertions(+) create mode 100644 src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java create mode 100644 src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java create mode 100644 src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapper.java create mode 100644 src/main/resources/mapper_xml/SerialNumberMapper.xml diff --git a/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java b/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java new file mode 100644 index 00000000..63b14de6 --- /dev/null +++ b/src/main/java/com/jsh/erp/datasource/entities/SerialNumber.java @@ -0,0 +1,325 @@ +package com.jsh.erp.datasource.entities; + +import java.util.Date; + +public class SerialNumber { + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.id + * + * @mbggenerated + */ + private Long id; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.material_Id + * + * @mbggenerated + */ + private Long materialId; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.serial_Number + * + * @mbggenerated + */ + private String serialNumber; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.is_Sell + * + * @mbggenerated + */ + private Boolean isSell; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.remark + * + * @mbggenerated + */ + private String remark; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.delete_Flag + * + * @mbggenerated + */ + private Boolean deleteFlag; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.create_Time + * + * @mbggenerated + */ + private Date createTime; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.creator + * + * @mbggenerated + */ + private Long creator; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.update_Time + * + * @mbggenerated + */ + private Date updateTime; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database column jsh_serial_number.updater + * + * @mbggenerated + */ + private Long updater; + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.id + * + * @return the value of jsh_serial_number.id + * + * @mbggenerated + */ + public Long getId() { + return id; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.id + * + * @param id the value for jsh_serial_number.id + * + * @mbggenerated + */ + public void setId(Long id) { + this.id = id; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.material_Id + * + * @return the value of jsh_serial_number.material_Id + * + * @mbggenerated + */ + public Long getMaterialId() { + return materialId; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.material_Id + * + * @param materialId the value for jsh_serial_number.material_Id + * + * @mbggenerated + */ + public void setMaterialId(Long materialId) { + this.materialId = materialId; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.serial_Number + * + * @return the value of jsh_serial_number.serial_Number + * + * @mbggenerated + */ + public String getSerialNumber() { + return serialNumber; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.serial_Number + * + * @param serialNumber the value for jsh_serial_number.serial_Number + * + * @mbggenerated + */ + public void setSerialNumber(String serialNumber) { + this.serialNumber = serialNumber == null ? null : serialNumber.trim(); + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.is_Sell + * + * @return the value of jsh_serial_number.is_Sell + * + * @mbggenerated + */ + public Boolean getIsSell() { + return isSell; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.is_Sell + * + * @param isSell the value for jsh_serial_number.is_Sell + * + * @mbggenerated + */ + public void setIsSell(Boolean isSell) { + this.isSell = isSell; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.remark + * + * @return the value of jsh_serial_number.remark + * + * @mbggenerated + */ + public String getRemark() { + return remark; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.remark + * + * @param remark the value for jsh_serial_number.remark + * + * @mbggenerated + */ + public void setRemark(String remark) { + this.remark = remark == null ? null : remark.trim(); + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.delete_Flag + * + * @return the value of jsh_serial_number.delete_Flag + * + * @mbggenerated + */ + public Boolean getDeleteFlag() { + return deleteFlag; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.delete_Flag + * + * @param deleteFlag the value for jsh_serial_number.delete_Flag + * + * @mbggenerated + */ + public void setDeleteFlag(Boolean deleteFlag) { + this.deleteFlag = deleteFlag; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.create_Time + * + * @return the value of jsh_serial_number.create_Time + * + * @mbggenerated + */ + public Date getCreateTime() { + return createTime; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.create_Time + * + * @param createTime the value for jsh_serial_number.create_Time + * + * @mbggenerated + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.creator + * + * @return the value of jsh_serial_number.creator + * + * @mbggenerated + */ + public Long getCreator() { + return creator; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.creator + * + * @param creator the value for jsh_serial_number.creator + * + * @mbggenerated + */ + public void setCreator(Long creator) { + this.creator = creator; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.update_Time + * + * @return the value of jsh_serial_number.update_Time + * + * @mbggenerated + */ + public Date getUpdateTime() { + return updateTime; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.update_Time + * + * @param updateTime the value for jsh_serial_number.update_Time + * + * @mbggenerated + */ + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column jsh_serial_number.updater + * + * @return the value of jsh_serial_number.updater + * + * @mbggenerated + */ + public Long getUpdater() { + return updater; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column jsh_serial_number.updater + * + * @param updater the value for jsh_serial_number.updater + * + * @mbggenerated + */ + public void setUpdater(Long updater) { + this.updater = updater; + } +} \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java b/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java new file mode 100644 index 00000000..10abeed2 --- /dev/null +++ b/src/main/java/com/jsh/erp/datasource/entities/SerialNumberExample.java @@ -0,0 +1,923 @@ +package com.jsh.erp.datasource.entities; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class SerialNumberExample { + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + protected String orderByClause; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + protected boolean distinct; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + protected List oredCriteria; + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public SerialNumberExample() { + oredCriteria = new ArrayList(); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public String getOrderByClause() { + return orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public boolean isDistinct() { + return distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public List getOredCriteria() { + return oredCriteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andMaterialIdIsNull() { + addCriterion("material_Id is null"); + return (Criteria) this; + } + + public Criteria andMaterialIdIsNotNull() { + addCriterion("material_Id is not null"); + return (Criteria) this; + } + + public Criteria andMaterialIdEqualTo(Long value) { + addCriterion("material_Id =", value, "materialId"); + return (Criteria) this; + } + + public Criteria andMaterialIdNotEqualTo(Long value) { + addCriterion("material_Id <>", value, "materialId"); + return (Criteria) this; + } + + public Criteria andMaterialIdGreaterThan(Long value) { + addCriterion("material_Id >", value, "materialId"); + return (Criteria) this; + } + + public Criteria andMaterialIdGreaterThanOrEqualTo(Long value) { + addCriterion("material_Id >=", value, "materialId"); + return (Criteria) this; + } + + public Criteria andMaterialIdLessThan(Long value) { + addCriterion("material_Id <", value, "materialId"); + return (Criteria) this; + } + + public Criteria andMaterialIdLessThanOrEqualTo(Long value) { + addCriterion("material_Id <=", value, "materialId"); + return (Criteria) this; + } + + public Criteria andMaterialIdIn(List values) { + addCriterion("material_Id in", values, "materialId"); + return (Criteria) this; + } + + public Criteria andMaterialIdNotIn(List values) { + addCriterion("material_Id not in", values, "materialId"); + return (Criteria) this; + } + + public Criteria andMaterialIdBetween(Long value1, Long value2) { + addCriterion("material_Id between", value1, value2, "materialId"); + return (Criteria) this; + } + + public Criteria andMaterialIdNotBetween(Long value1, Long value2) { + addCriterion("material_Id not between", value1, value2, "materialId"); + return (Criteria) this; + } + + public Criteria andSerialNumberIsNull() { + addCriterion("serial_Number is null"); + return (Criteria) this; + } + + public Criteria andSerialNumberIsNotNull() { + addCriterion("serial_Number is not null"); + return (Criteria) this; + } + + public Criteria andSerialNumberEqualTo(String value) { + addCriterion("serial_Number =", value, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberNotEqualTo(String value) { + addCriterion("serial_Number <>", value, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberGreaterThan(String value) { + addCriterion("serial_Number >", value, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberGreaterThanOrEqualTo(String value) { + addCriterion("serial_Number >=", value, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberLessThan(String value) { + addCriterion("serial_Number <", value, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberLessThanOrEqualTo(String value) { + addCriterion("serial_Number <=", value, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberLike(String value) { + addCriterion("serial_Number like", value, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberNotLike(String value) { + addCriterion("serial_Number not like", value, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberIn(List values) { + addCriterion("serial_Number in", values, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberNotIn(List values) { + addCriterion("serial_Number not in", values, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberBetween(String value1, String value2) { + addCriterion("serial_Number between", value1, value2, "serialNumber"); + return (Criteria) this; + } + + public Criteria andSerialNumberNotBetween(String value1, String value2) { + addCriterion("serial_Number not between", value1, value2, "serialNumber"); + return (Criteria) this; + } + + public Criteria andIsSellIsNull() { + addCriterion("is_Sell is null"); + return (Criteria) this; + } + + public Criteria andIsSellIsNotNull() { + addCriterion("is_Sell is not null"); + return (Criteria) this; + } + + public Criteria andIsSellEqualTo(Boolean value) { + addCriterion("is_Sell =", value, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellNotEqualTo(Boolean value) { + addCriterion("is_Sell <>", value, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellGreaterThan(Boolean value) { + addCriterion("is_Sell >", value, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellGreaterThanOrEqualTo(Boolean value) { + addCriterion("is_Sell >=", value, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellLessThan(Boolean value) { + addCriterion("is_Sell <", value, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellLessThanOrEqualTo(Boolean value) { + addCriterion("is_Sell <=", value, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellIn(List values) { + addCriterion("is_Sell in", values, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellNotIn(List values) { + addCriterion("is_Sell not in", values, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellBetween(Boolean value1, Boolean value2) { + addCriterion("is_Sell between", value1, value2, "isSell"); + return (Criteria) this; + } + + public Criteria andIsSellNotBetween(Boolean value1, Boolean value2) { + addCriterion("is_Sell not between", value1, value2, "isSell"); + return (Criteria) this; + } + + public Criteria andRemarkIsNull() { + addCriterion("remark is null"); + return (Criteria) this; + } + + public Criteria andRemarkIsNotNull() { + addCriterion("remark is not null"); + return (Criteria) this; + } + + public Criteria andRemarkEqualTo(String value) { + addCriterion("remark =", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotEqualTo(String value) { + addCriterion("remark <>", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThan(String value) { + addCriterion("remark >", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThanOrEqualTo(String value) { + addCriterion("remark >=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThan(String value) { + addCriterion("remark <", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThanOrEqualTo(String value) { + addCriterion("remark <=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLike(String value) { + addCriterion("remark like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotLike(String value) { + addCriterion("remark not like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkIn(List values) { + addCriterion("remark in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotIn(List values) { + addCriterion("remark not in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkBetween(String value1, String value2) { + addCriterion("remark between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotBetween(String value1, String value2) { + addCriterion("remark not between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andDeleteFlagIsNull() { + addCriterion("delete_Flag is null"); + return (Criteria) this; + } + + public Criteria andDeleteFlagIsNotNull() { + addCriterion("delete_Flag is not null"); + return (Criteria) this; + } + + public Criteria andDeleteFlagEqualTo(Boolean value) { + addCriterion("delete_Flag =", value, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andDeleteFlagNotEqualTo(Boolean value) { + addCriterion("delete_Flag <>", value, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andDeleteFlagGreaterThan(Boolean value) { + addCriterion("delete_Flag >", value, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andDeleteFlagGreaterThanOrEqualTo(Boolean value) { + addCriterion("delete_Flag >=", value, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andDeleteFlagLessThan(Boolean value) { + addCriterion("delete_Flag <", value, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andDeleteFlagLessThanOrEqualTo(Boolean value) { + addCriterion("delete_Flag <=", value, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andDeleteFlagIn(List values) { + addCriterion("delete_Flag in", values, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andDeleteFlagNotIn(List values) { + addCriterion("delete_Flag not in", values, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andDeleteFlagBetween(Boolean value1, Boolean value2) { + addCriterion("delete_Flag between", value1, value2, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andDeleteFlagNotBetween(Boolean value1, Boolean value2) { + addCriterion("delete_Flag not between", value1, value2, "deleteFlag"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNull() { + addCriterion("create_Time is null"); + return (Criteria) this; + } + + public Criteria andCreateTimeIsNotNull() { + addCriterion("create_Time is not null"); + return (Criteria) this; + } + + public Criteria andCreateTimeEqualTo(Date value) { + addCriterion("create_Time =", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotEqualTo(Date value) { + addCriterion("create_Time <>", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThan(Date value) { + addCriterion("create_Time >", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("create_Time >=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThan(Date value) { + addCriterion("create_Time <", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeLessThanOrEqualTo(Date value) { + addCriterion("create_Time <=", value, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeIn(List values) { + addCriterion("create_Time in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotIn(List values) { + addCriterion("create_Time not in", values, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeBetween(Date value1, Date value2) { + addCriterion("create_Time between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreateTimeNotBetween(Date value1, Date value2) { + addCriterion("create_Time not between", value1, value2, "createTime"); + return (Criteria) this; + } + + public Criteria andCreatorIsNull() { + addCriterion("creator is null"); + return (Criteria) this; + } + + public Criteria andCreatorIsNotNull() { + addCriterion("creator is not null"); + return (Criteria) this; + } + + public Criteria andCreatorEqualTo(Long value) { + addCriterion("creator =", value, "creator"); + return (Criteria) this; + } + + public Criteria andCreatorNotEqualTo(Long value) { + addCriterion("creator <>", value, "creator"); + return (Criteria) this; + } + + public Criteria andCreatorGreaterThan(Long value) { + addCriterion("creator >", value, "creator"); + return (Criteria) this; + } + + public Criteria andCreatorGreaterThanOrEqualTo(Long value) { + addCriterion("creator >=", value, "creator"); + return (Criteria) this; + } + + public Criteria andCreatorLessThan(Long value) { + addCriterion("creator <", value, "creator"); + return (Criteria) this; + } + + public Criteria andCreatorLessThanOrEqualTo(Long value) { + addCriterion("creator <=", value, "creator"); + return (Criteria) this; + } + + public Criteria andCreatorIn(List values) { + addCriterion("creator in", values, "creator"); + return (Criteria) this; + } + + public Criteria andCreatorNotIn(List values) { + addCriterion("creator not in", values, "creator"); + return (Criteria) this; + } + + public Criteria andCreatorBetween(Long value1, Long value2) { + addCriterion("creator between", value1, value2, "creator"); + return (Criteria) this; + } + + public Criteria andCreatorNotBetween(Long value1, Long value2) { + addCriterion("creator not between", value1, value2, "creator"); + return (Criteria) this; + } + + public Criteria andUpdateTimeIsNull() { + addCriterion("update_Time is null"); + return (Criteria) this; + } + + public Criteria andUpdateTimeIsNotNull() { + addCriterion("update_Time is not null"); + return (Criteria) this; + } + + public Criteria andUpdateTimeEqualTo(Date value) { + addCriterion("update_Time =", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeNotEqualTo(Date value) { + addCriterion("update_Time <>", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeGreaterThan(Date value) { + addCriterion("update_Time >", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) { + addCriterion("update_Time >=", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeLessThan(Date value) { + addCriterion("update_Time <", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeLessThanOrEqualTo(Date value) { + addCriterion("update_Time <=", value, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeIn(List values) { + addCriterion("update_Time in", values, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeNotIn(List values) { + addCriterion("update_Time not in", values, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeBetween(Date value1, Date value2) { + addCriterion("update_Time between", value1, value2, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdateTimeNotBetween(Date value1, Date value2) { + addCriterion("update_Time not between", value1, value2, "updateTime"); + return (Criteria) this; + } + + public Criteria andUpdaterIsNull() { + addCriterion("updater is null"); + return (Criteria) this; + } + + public Criteria andUpdaterIsNotNull() { + addCriterion("updater is not null"); + return (Criteria) this; + } + + public Criteria andUpdaterEqualTo(Long value) { + addCriterion("updater =", value, "updater"); + return (Criteria) this; + } + + public Criteria andUpdaterNotEqualTo(Long value) { + addCriterion("updater <>", value, "updater"); + return (Criteria) this; + } + + public Criteria andUpdaterGreaterThan(Long value) { + addCriterion("updater >", value, "updater"); + return (Criteria) this; + } + + public Criteria andUpdaterGreaterThanOrEqualTo(Long value) { + addCriterion("updater >=", value, "updater"); + return (Criteria) this; + } + + public Criteria andUpdaterLessThan(Long value) { + addCriterion("updater <", value, "updater"); + return (Criteria) this; + } + + public Criteria andUpdaterLessThanOrEqualTo(Long value) { + addCriterion("updater <=", value, "updater"); + return (Criteria) this; + } + + public Criteria andUpdaterIn(List values) { + addCriterion("updater in", values, "updater"); + return (Criteria) this; + } + + public Criteria andUpdaterNotIn(List values) { + addCriterion("updater not in", values, "updater"); + return (Criteria) this; + } + + public Criteria andUpdaterBetween(Long value1, Long value2) { + addCriterion("updater between", value1, value2, "updater"); + return (Criteria) this; + } + + public Criteria andUpdaterNotBetween(Long value1, Long value2) { + addCriterion("updater not between", value1, value2, "updater"); + return (Criteria) this; + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table jsh_serial_number + * + * @mbggenerated do_not_delete_during_merge + */ + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapper.java b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapper.java new file mode 100644 index 00000000..2fee8176 --- /dev/null +++ b/src/main/java/com/jsh/erp/datasource/mappers/SerialNumberMapper.java @@ -0,0 +1,97 @@ +package com.jsh.erp.datasource.mappers; + +import com.jsh.erp.datasource.entities.SerialNumber; +import com.jsh.erp.datasource.entities.SerialNumberExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface SerialNumberMapper { + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + int countByExample(SerialNumberExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + int deleteByExample(SerialNumberExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + int deleteByPrimaryKey(Long id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + int insert(SerialNumber record); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + int insertSelective(SerialNumber record); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + List selectByExample(SerialNumberExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + SerialNumber selectByPrimaryKey(Long id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + int updateByExampleSelective(@Param("record") SerialNumber record, @Param("example") SerialNumberExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + int updateByExample(@Param("record") SerialNumber record, @Param("example") SerialNumberExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + int updateByPrimaryKeySelective(SerialNumber record); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table jsh_serial_number + * + * @mbggenerated + */ + int updateByPrimaryKey(SerialNumber record); + +} \ No newline at end of file diff --git a/src/main/resources/mapper_xml/SerialNumberMapper.xml b/src/main/resources/mapper_xml/SerialNumberMapper.xml new file mode 100644 index 00000000..ea0d1c84 --- /dev/null +++ b/src/main/resources/mapper_xml/SerialNumberMapper.xml @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + id, material_Id, serial_Number, is_Sell, remark, delete_Flag, create_Time, creator, + update_Time, updater + + + + + + delete from jsh_serial_number + where id = #{id,jdbcType=BIGINT} + + + + delete from jsh_serial_number + + + + + + + insert into jsh_serial_number (id, material_Id, serial_Number, + is_Sell, remark, delete_Flag, + create_Time, creator, update_Time, + updater) + values (#{id,jdbcType=BIGINT}, #{materialId,jdbcType=BIGINT}, #{serialNumber,jdbcType=VARCHAR}, + #{isSell,jdbcType=BIT}, #{remark,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=BIT}, + #{createTime,jdbcType=TIMESTAMP}, #{creator,jdbcType=BIGINT}, #{updateTime,jdbcType=TIMESTAMP}, + #{updater,jdbcType=BIGINT}) + + + + insert into jsh_serial_number + + + id, + + + material_Id, + + + serial_Number, + + + is_Sell, + + + remark, + + + delete_Flag, + + + create_Time, + + + creator, + + + update_Time, + + + updater, + + + + + #{id,jdbcType=BIGINT}, + + + #{materialId,jdbcType=BIGINT}, + + + #{serialNumber,jdbcType=VARCHAR}, + + + #{isSell,jdbcType=BIT}, + + + #{remark,jdbcType=VARCHAR}, + + + #{deleteFlag,jdbcType=BIT}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{creator,jdbcType=BIGINT}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + #{updater,jdbcType=BIGINT}, + + + + + + + update jsh_serial_number + + + id = #{record.id,jdbcType=BIGINT}, + + + material_Id = #{record.materialId,jdbcType=BIGINT}, + + + serial_Number = #{record.serialNumber,jdbcType=VARCHAR}, + + + is_Sell = #{record.isSell,jdbcType=BIT}, + + + remark = #{record.remark,jdbcType=VARCHAR}, + + + delete_Flag = #{record.deleteFlag,jdbcType=BIT}, + + + create_Time = #{record.createTime,jdbcType=TIMESTAMP}, + + + creator = #{record.creator,jdbcType=BIGINT}, + + + update_Time = #{record.updateTime,jdbcType=TIMESTAMP}, + + + updater = #{record.updater,jdbcType=BIGINT}, + + + + + + + + + update jsh_serial_number + set id = #{record.id,jdbcType=BIGINT}, + material_Id = #{record.materialId,jdbcType=BIGINT}, + serial_Number = #{record.serialNumber,jdbcType=VARCHAR}, + is_Sell = #{record.isSell,jdbcType=BIT}, + remark = #{record.remark,jdbcType=VARCHAR}, + delete_Flag = #{record.deleteFlag,jdbcType=BIT}, + create_Time = #{record.createTime,jdbcType=TIMESTAMP}, + creator = #{record.creator,jdbcType=BIGINT}, + update_Time = #{record.updateTime,jdbcType=TIMESTAMP}, + updater = #{record.updater,jdbcType=BIGINT} + + + + + + + update jsh_serial_number + + + material_Id = #{materialId,jdbcType=BIGINT}, + + + serial_Number = #{serialNumber,jdbcType=VARCHAR}, + + + is_Sell = #{isSell,jdbcType=BIT}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + delete_Flag = #{deleteFlag,jdbcType=BIT}, + + + create_Time = #{createTime,jdbcType=TIMESTAMP}, + + + creator = #{creator,jdbcType=BIGINT}, + + + update_Time = #{updateTime,jdbcType=TIMESTAMP}, + + + updater = #{updater,jdbcType=BIGINT}, + + + where id = #{id,jdbcType=BIGINT} + + + + update jsh_serial_number + set material_Id = #{materialId,jdbcType=BIGINT}, + serial_Number = #{serialNumber,jdbcType=VARCHAR}, + is_Sell = #{isSell,jdbcType=BIT}, + remark = #{remark,jdbcType=VARCHAR}, + delete_Flag = #{deleteFlag,jdbcType=BIT}, + create_Time = #{createTime,jdbcType=TIMESTAMP}, + creator = #{creator,jdbcType=BIGINT}, + update_Time = #{updateTime,jdbcType=TIMESTAMP}, + updater = #{updater,jdbcType=BIGINT} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file From 53bc050552e6762057826c3ef8c1ca19b0516b80 Mon Sep 17 00:00:00 2001 From: cjl Date: Wed, 23 Jan 2019 15:59:56 +0800 Subject: [PATCH 3/4] =?UTF-8?q?createTime=E8=BF=94=E5=9B=9E=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E6=9C=89=E6=97=B6=E5=88=86=E7=A7=92=EF=BC=8CupdateTim?= =?UTF-8?q?e=E8=BF=94=E5=9B=9E=E6=B2=A1=E6=9C=89=EF=BC=8C=E6=9C=89?= =?UTF-8?q?=E4=BA=BA=E5=AF=B9createTime=E5=81=9A=E4=BA=86=E7=89=B9?= =?UTF-8?q?=E6=AE=8A=E5=A4=84=E7=90=86=EF=BC=8C=E5=9C=A8=E6=AD=A4=E5=A4=84?= =?UTF-8?q?=E5=8A=A0=E4=B8=8AupdateTime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- erp_web/pages/manage/serialNumber.html | 38 +++- .../com/jsh/erp/utils/ResponseJsonUtil.java | 166 +++++++++--------- 2 files changed, 119 insertions(+), 85 deletions(-) diff --git a/erp_web/pages/manage/serialNumber.html b/erp_web/pages/manage/serialNumber.html index 0c95b92e..5082dde6 100644 --- a/erp_web/pages/manage/serialNumber.html +++ b/erp_web/pages/manage/serialNumber.html @@ -162,8 +162,8 @@ return value ? "是" : "否"; } }, - {title: '创建时间', field: 'createTime', width: 70}, - {title: '更新时间', field: 'updateTime', width: 70}, + {title: '创建时间', field: 'createTime', width: 140,formatter: formatDatebox}, + {title: '更新时间', field: 'updateTime', width: 140,formatter: formatDatebox}, {title: '备注', field: 'remark',width: 300} ]], toolbar: [ @@ -448,6 +448,40 @@ $("#searchBtn").click(); } }); + /**时间格式化*/ + Date.prototype.format = function (format) { + var o = { + "M+": this.getMonth() + 1, // month + "d+": this.getDate(), // day + "h+": this.getHours(), // hour + "m+": this.getMinutes(), // minute + "s+": this.getSeconds(), // second + "q+": Math.floor((this.getMonth() + 3) / 3), // quarter + "S": this.getMilliseconds() + // millisecond + } + if (/(y+)/.test(format)) + format = format.replace(RegExp.$1, (this.getFullYear() + "") + .substr(4 - RegExp.$1.length)); + for (var k in o) + if (new RegExp("(" + k + ")").test(format)) + format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); + return format; + } + function formatDatebox(value) { + if (value == null || value == '') { + return ''; + } + var dt; + if (value instanceof Date) { + dt = value; + } else { + dt = new Date(value); + } + + return dt.format("yyyy-MM-dd hh:mm:ss"); //扩展的Date的format方法(上述插件实现) + } + diff --git a/src/main/java/com/jsh/erp/utils/ResponseJsonUtil.java b/src/main/java/com/jsh/erp/utils/ResponseJsonUtil.java index 953cc8d6..2f7fee30 100644 --- a/src/main/java/com/jsh/erp/utils/ResponseJsonUtil.java +++ b/src/main/java/com/jsh/erp/utils/ResponseJsonUtil.java @@ -1,83 +1,83 @@ -package com.jsh.erp.utils; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.serializer.SerializerFeature; -import com.alibaba.fastjson.serializer.ValueFilter; - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.TimeZone; - -public class ResponseJsonUtil { - public static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd"); - - static { - FORMAT.setTimeZone(TimeZone.getTimeZone("GMT+8")); - } - - /** - * 响应过滤器 - */ - public static final class ResponseFilter extends ExtJsonUtils.ExtFilter implements ValueFilter { - @Override - public Object process(Object object, String name, Object value) { - if (name.equals("createTime") || name.equals("modifyTime")) { - return value; - } else if (value instanceof Date) { - return FORMAT.format(value); - } else { - return value; - } - } - } - - /** - * - * @param responseCode - * @return - */ - public static String backJson4HttpApi(ResponseCode responseCode) { - if (responseCode != null) { - String result = JSON.toJSONString(responseCode, new ResponseFilter(), - SerializerFeature.DisableCircularReferenceDetect, - SerializerFeature.WriteNonStringKeyAsString); - result = result.replaceFirst("\"data\":\\{", ""); - return result.substring(0, result.length() - 1); - } - return null; - } - - /** - * 验证失败的json串 - * @param code - * @return - */ - public static String backJson4VerifyFailure(int code) { - Map map = new HashMap(); - map.put("message", "未通过验证"); - return JSON.toJSONString(new ResponseCode(code, map), new ResponseFilter(), - SerializerFeature.DisableCircularReferenceDetect, - SerializerFeature.WriteNonStringKeyAsString); - } - - /** - * 成功的json串 - * @param responseCode - * @return - */ - public static String backJson(ResponseCode responseCode) { - if (responseCode != null) { - return JSON.toJSONString(responseCode, new ResponseFilter(), - SerializerFeature.DisableCircularReferenceDetect, - SerializerFeature.WriteNonStringKeyAsString); - } - return null; - } - - public static String returnJson(Map map, String message, int code) { - map.put("message", message); - return backJson(new ResponseCode(code, map)); - } -} +package com.jsh.erp.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.alibaba.fastjson.serializer.ValueFilter; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.TimeZone; + +public class ResponseJsonUtil { + public static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + + static { + FORMAT.setTimeZone(TimeZone.getTimeZone("GMT+8")); + } + + /** + * 响应过滤器 + */ + public static final class ResponseFilter extends ExtJsonUtils.ExtFilter implements ValueFilter { + @Override + public Object process(Object object, String name, Object value) { + if (name.equals("createTime") || name.equals("modifyTime")||name.equals("updateTime")) { + return value; + } else if (value instanceof Date) { + return FORMAT.format(value); + } else { + return value; + } + } + } + + /** + * + * @param responseCode + * @return + */ + public static String backJson4HttpApi(ResponseCode responseCode) { + if (responseCode != null) { + String result = JSON.toJSONString(responseCode, new ResponseFilter(), + SerializerFeature.DisableCircularReferenceDetect, + SerializerFeature.WriteNonStringKeyAsString); + result = result.replaceFirst("\"data\":\\{", ""); + return result.substring(0, result.length() - 1); + } + return null; + } + + /** + * 验证失败的json串 + * @param code + * @return + */ + public static String backJson4VerifyFailure(int code) { + Map map = new HashMap(); + map.put("message", "未通过验证"); + return JSON.toJSONString(new ResponseCode(code, map), new ResponseFilter(), + SerializerFeature.DisableCircularReferenceDetect, + SerializerFeature.WriteNonStringKeyAsString); + } + + /** + * 成功的json串 + * @param responseCode + * @return + */ + public static String backJson(ResponseCode responseCode) { + if (responseCode != null) { + return JSON.toJSONString(responseCode, new ResponseFilter(), + SerializerFeature.DisableCircularReferenceDetect, + SerializerFeature.WriteNonStringKeyAsString); + } + return null; + } + + public static String returnJson(Map map, String message, int code) { + map.put("message", message); + return backJson(new ResponseCode(code, map)); + } +} From e5262b098150bb7855a83435a8ec9419539d5130 Mon Sep 17 00:00:00 2001 From: cjl Date: Wed, 23 Jan 2019 16:51:34 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=95=86=E5=93=81?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E9=A1=B5=E9=9D=A2=EF=BC=8C=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8F=B7=E5=AD=97=E6=AE=B5=E7=9A=84=E6=A0=B7=E5=BC=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- erp_web/pages/materials/material.html | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/erp_web/pages/materials/material.html b/erp_web/pages/materials/material.html index ae5112cb..63c791e6 100644 --- a/erp_web/pages/materials/material.html +++ b/erp_web/pages/materials/material.html @@ -93,7 +93,7 @@ 序列号 - @@ -1160,7 +1160,9 @@ $('#materialFM input').val(""); //将输入框全部清空 bindMProperty(); //根据商品属性绑定 - $("#enableSerialNumber").combobox('setValue','0'); + // $("#enableSerialNumber").combobox('setValue','0'); + $("#enableSerialNumber").val('0'); + $('#materialDlg').dialog('open').dialog('setTitle', ' 增加商品信息'); $(".window-mask").css({width: webW, height: webH}); $("#Name").val("").focus(); @@ -1286,7 +1288,7 @@ basicList.LowPrice = $("#basicLowPrice").val(); basicList.PresetPriceOne = $("#basicPresetPriceOne").val(); basicList.PresetPriceTwo = $("#basicPresetPriceTwo").val(); - basicList.enableSerialNumber=$("#enableSerialNumber").combobox('getValue'); + basicList.enableSerialNumber=$("#enableSerialNumber").val(); otherList.Unit = $("#otherUnit").text(); otherList.RetailPrice = $("#otherRetailPrice").val(); otherList.LowPrice = $("#otherLowPrice").val(); @@ -1360,7 +1362,8 @@ $("#Color").focus().val(materialInfo[11]); // console.log("enableSerialNumber:"+(materialInfo[24]=='true'?'1':'0')); // console.log("enableSerialNumber:"+materialInfo[24]); - $("#enableSerialNumber").combobox('setValue',materialInfo[24]=='true'?'1':'0'); + // $("#enableSerialNumber").combobox('setValue',materialInfo[24]=='true'?'1':'0'); + $("#enableSerialNumber").val(materialInfo[24]=='true'?'1':'0'); // console.log($("#enableSerialNumber").val()); var categoryName = ""; //类型名称