开发人员工具
BUG更新
白坯库存表有库存批量计划页面没有
初次发现在东诚2024年9月12日,问题根源是 ContactcompanyMapper.xml # selectByPrimaryKey 中使用了 ltrim(rtrim()) 导致可能查询到多个记录,而 java 源码中接受到的是单个对象。修复方法是创建了新的存储过程:
CREATE DEFINER=`root`@`%` PROCEDURE `usp_getContactCompany8Sid`(_sId VARCHAR(100))
BEGIN
select * from contactcompany where sId = _sId;
END
然后修改方法 selectByPrimaryKey 为使用该存储过程获取数据。需要检查今年几个新客户:天力、金龙、招商
铭凯威第一缸数量翻倍
铭凯威源码来自俪铭(无库存开单),批量生成计划单的前端页面中设置批量生成的方案后前端页面 SC_FlatPlanBill_newNoKC.js 会统计方案中的所有数量导致数量翻倍,搜索代码 function doSave(greyFabricDetail, procedure, detailBill, url) { 找到 js 代码通过 reduce 汇总的代码,修改为取第一行数量来生成第一个缸单。
批量计划单第二批次公斤为负
现象
批量生成计划单页面中选择按照匹数排单,举例:2匹一缸,生成3个计划单,使用两个批次的白坯,批次01有3匹90公斤,批次02有3匹60公斤。在批量生成计划单时第二个缸单中会用到批次01的1匹布,同时用到批次02的1匹布。由于按照匹数排单,系统没有按照平均匹重填充公斤数(小李修改了新盛毛纺的逻辑)导致第一个计划单用掉2匹0公斤,第二个缸单用掉批次01的1匹90公斤,用掉批次02的1匹-90公斤(系统按照公斤数0计算,先清空批次01剩余的所有90公斤,再抵消该数量用掉批次02的负数公斤)。
原因
初次制作批量生成计划单功能时制作的工具类 PlanUtils.java 的方法 public Map<Long, List<DetailbillPlan>> createLathes(List<GreyFabricReposity> greyFabricReposityList, MultipleReplicationModel pickingData, Integer calculateState) 在 for 循环的第三个 if 中最后一行代码 retMap.put 上面的设置3个数量中直接使用了 剩余未分配数 减去 白坯数量 导致的。
解决
在上面 原因 中提到的地方将负数替换为0即可解决:
/**
* 2024年4月10日 12:52:21:
* 本次更新检测如果 surplusData.getKilo() - batchUsedKilo 是负数则纠正为0
* 为解决使用两个批次时导致第二个批次用量为负数的问题
*/
Double nextPiece = surplusData.getPiece() - batchUsedPiece < 0 ? 0 : surplusData.getPiece() - batchUsedPiece;
Double nexKilo = surplusData.getKilo() - batchUsedKilo < 0 ? 0 : surplusData.getKilo() - batchUsedKilo;
Double nextMeter = surplusData.getMeter() - batchUsedMeter < 0 ? 0 : surplusData.getMeter() - batchUsedMeter;
surplusData.setPiece(nextPiece);
surplusData.setKilo(nexKilo);
surplusData.setMeter(nextMeter);
年终结转
- 白玉兰的智能仓库有预发货单,年终结转清除数据时要清理掉预发货单
- 有使用染缸刷卡客户端的,在年终结转后需要清理表
g_RSProcessDetail。一车一张缸单的用法需要使用独立的染缸刷卡客户端,一缸一张缸单的用法使用的是通用的车间刷卡客户端,不需要清理该表
通用更新
A5细码单净重含隐藏空加
检查文件 GeneratorDetailBillMapper.xml 的方法 getDtlRowsItemByVatNumber,在减法中去掉字段 b_kjznp ,即保留隐藏空加到净重上
重复执行加载
配置文件 web.xml 在标签 context-param 中加载了配置文件 Spring/spring-context.xml 同时在标签 servlet 中也加载了该配置文件,该配置文件通过 component-scan 扫描加载控制器、服务层、实体类等等包,控制器包下的类 NotUploadTask.java 是定时任务类,就导致加载了两次定时任务,即定时任务会被执行两次。白坯入库后推送数据到云端时会有两个线程执行该任务,在出现并发的情况下会将一笔数据推送两次到云端,微信服务后台会推送两次给客户微信。要在配置文件 web.xml 中注释掉名称是 springServlet 的 servlet 标签下的读取配置文件 Spring/spring-context.xml 的代码,第一次制作在新盛针纺,代码如下
<servlet>
<servlet-name>springServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!-- classpath:Spring/spring-context.xml-->
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
修改计划单时递进式归还计划数量
在自动领料页面删除车数分配方案(删除右下角表格的行)要归还数量到待扣数量(左下角待扣表格),删除待扣表格行时要归还数量到上面的白坯库存的可用数量上,在 2024年7月6日 08:06:07 为天力解决了该问题(在计划单序时表中双击打开计划单),此次记录添加和修改的文件,要同步到其他客户:新盛毛纺、盛鑫、东诚、招商、金龙
# 新增存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_getCartQtyAndRK`(IN vatNo VARCHAR(100))
BEGIN
# 2024年7月5日 09:50:26
select a.*,b.pId
from detailbill_plan a
left join bpbilldetail b on a.fId = b.id
where a.vatNO = vatNo
order by a.serialNO asc
;
END
新增实体类:DetailbillPlanAndRK
package account.entity;
import java.io.Serializable;
/**
* 2024年7月5日 09:47:15 天力发现问题:
* 从计划开单序时表中双击打开计划单后在自动领料页面删除车数分配方案后数量无法归还到待扣数量上
* 后来检查逻辑发现前端页面中使用车分配方案的字段 detailbill_plan.fId = 左边待扣白坯(入库明细)的主键
* 进行对比,而前者的 fId 实际是计划领料明细的主键,所以永远不等,添加该实体类是为了前端在车数分配方案的数据中
* 能获取到对应的白坯入库主键,之后的对比应该是 detailbill_plan.pId = 左边待扣白坯主键
*/
public class DetailbillPlanAndRK implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Long fId;
private String vatNO;
private Integer serialNO;
private Double piece;
private Double kilo;
private Double meter;
private Integer pId;// 车数分配方案关联的计划领料明细数据的 pId = 白坯入库明细主键
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getfId() {
return fId;
}
public void setfId(Long fId) {
this.fId = fId;
}
public String getVatNO() {
return vatNO;
}
public void setVatNO(String vatNO) {
this.vatNO = vatNO;
}
public Integer getSerialNO() {
return serialNO;
}
public void setSerialNO(Integer serialNO) {
this.serialNO = serialNO;
}
public Double getPiece() {
return piece;
}
public void setPiece(Double piece) {
this.piece = piece;
}
public Double getKilo() {
return kilo;
}
public void setKilo(Double kilo) {
this.kilo = kilo;
}
public Double getMeter() {
return meter;
}
public void setMeter(Double meter) {
this.meter = meter;
}
public Integer getpId() {
return pId;
}
public void setpId(Integer pId) {
this.pId = pId;
}
@Override
public String toString() {
return "DetailbillPlanAndRK{" +
"id=" + id +
", fId=" + fId +
", vatNO='" + vatNO + '\'' +
", serialNO=" + serialNO +
", piece=" + piece +
", kilo=" + kilo +
", meter=" + meter +
", pId=" + pId +
'}';
}
}
文件 DetailbillPlanMapper.xml 添加下面函数,同时为所有上层服务添加同名的方法
<resultMap id="DetailbillPlanAndRKMap" type="account.entity.DetailbillPlanAndRK">
<id column="id" jdbcType="BIGINT" property="id"/>
<result column="fId" jdbcType="INTEGER" property="fId"/>
<result column="vatNO" jdbcType="VARCHAR" property="vatNO"/>
<result column="serialNO" jdbcType="INTEGER" property="serialNO"/>
<result column="piece" jdbcType="DOUBLE" property="piece"/>
<result column="kilo" jdbcType="DOUBLE" property="kilo"/>
<result column="meter" jdbcType="DOUBLE" property="meter"/>
<result column="pId" jdbcType="INTEGER" property="pId"/>
</resultMap>
<select id="getCartQtyAndRK" resultMap="DetailbillPlanAndRKMap">
call usp_getCartQtyAndRK(#{vatNo,jdbcType=VARCHAR});
</select>
为文件 DetailbillPlanMapper.java 添加下面方法
List<DetailbillPlanAndRK> getCartQtyAndRK(String vatNo);
实现方法
@Override
public List<DetailbillPlanAndRK> getCartQtyAndRK(String vatNo){
vatNo = Optional.ofNullable(vatNo).orElse("");
return dao.getCartQtyAndRK(vatNo);
}
为接口 PlanBillService.java 添加函数 List<DetailbillPlanAndRK> getCartQtyAndRK(String vatNO) throws Exception; ,
@Override
public List<DetailbillPlanAndRK> getCartQtyAndRK(String vatNO) throws Exception{
return detailbillPlanService.getCartQtyAndRK(vatNO);
}
制作实现类后在控制器 PlanBillController.java 中添加方法
@RequestMapping(value = "/getCartQtyAndRK", method = RequestMethod.GET)
@RequiresRoles(value = {RoleId.PLAN, RoleId.ADMIN}, logical = Logical.OR)
public List<DetailbillPlanAndRK> getCartQtyAndRK(@RequestParam(value = "vatNO", required = false) String vatNO) throws Exception {
return service.getCartQtyAndRK(vatNO);
}
前端文件 SC_DyePlanBill_Out.html 中搜索代码 <div data-options="name:'del_recent',iconCls:'icon-no'">删除当前</div> 修改调用的函数 menuHandler 为 waitMenuHandler ,并为文件 SC_PlanBill_outputbill.js 添加下面多个函数
// 2024年7月5日 10:20:23 添加代码 =========================================================================
// 待扣表格右键菜单处理函数,替代原本的函数 menuHandler
function waitMenuHandler(items){
const menuItem = items.name;
if(menuItem == 'del_recent'){// 删除选中行的待扣白坯
const rowIndex = $("#bp_out_wait").edatagrid('getRowIndex', $("#bp_out_wait").datagrid('getSelected'));
delOneWait(rowIndex);
}else if(menuItem == 'del_all'){// 清除所有待扣白坯
delAllwait()
}else{
$.messager.alert("提示", "没有该菜单项的功能!", "warning");
}
}
// 删除待扣表格的所有数据
function delAllwait(){
const waitRows = $("#bp_out_wait").datagrid('getRows');// 待扣表格所有数据
for (let i = 0; i < waitRows.length; i++) {
delOneWait(i);// 逐行删除,递进归还数量
}
}
/**
* 删除左下角表格(待扣白坯)一行数据
* 删除一行数据之前先删除右边车数分配表格中对应的所有数据
* 同时将待扣数量归还到上面的白坯库存表格中
* @param rowIndex 表格行号
*/
function delOneWait(rowIndex){
const waitRows = $("#bp_out_wait").datagrid('getRows');// 待扣表格所有数据
if(!waitRows || waitRows.length == 0){
$.messager.alert("提示", "没有数据,无需删除!", "warning");
return
}
const targetRow = waitRows[rowIndex];
if(!targetRow){
$.messager.alert("提示", `行号${rowIndex}的数据为空,无法删除!`, "warning");
return
}
const rkId = targetRow.id || 0;
delCartRows8PID(rkId);// 删除车数分配表格中所有关联的行,并归还数据到待扣表格中
// 1. 归还待扣数量到上面白坯库存表格
const invRows = $("#bp_out").datagrid('getRows');// 白坯库存表所有行
for (let i = 0; i < invRows.length; i++) {
const currentRow = invRows[i];
if(currentRow.id != rkId) continue;
$("#bp_out").datagrid('updateRow', {
index: i,
row: {
audit_pairs: (parseFloat(currentRow.audit_pairs) + parseFloat(targetRow.audit_pairs)).toFixed(2),
audit_kilo: (parseFloat(currentRow.audit_kilo) + parseFloat(targetRow.audit_kilo)).toFixed(2),
audit_meter: (parseFloat(currentRow.audit_meter) + parseFloat(targetRow.audit_meter)).toFixed(2)
}
});
}
// 2. 删除待扣表格的行
$("#bp_out_wait").datagrid('deleteRow', rowIndex);
}
/**
* 根据字段 pId 删除右下角车数分配方案的行
* @param pId 白坯入库明细主键
*/
function delCartRows8PID(pId){
if(!pId || pId == 0) return
const cartRows = $("#bp_out_total").datagrid('getRows');// 待扣表格所有数据
if(!cartRows || cartRows.length == 0) return
// 遍历车数分配方案表格,删除所有对应的分配的行
for (let i = cartRows.length - 1; i >= 0; i--) {
const currentRow = cartRows[i];
if(!currentRow) continue;
const thePID = currentRow.pId || 0;
if(pId == thePID) delCartRow8Index(i);
}
}
/**
* 根据行号删除右边车数分配表格的行,同时实现的逻辑:
* 1. 归还数量给左下角待扣表格对应批次白坯
* 2. 修改主要素页面的计划数量
* @param rowIndex 车数分配方案表格的行号
*/
function delCartRow8Index(rowIndex){
rowIndex = rowIndex || 0;
const cartRows = $("#bp_out_total").datagrid('getRows');
if(!cartRows || cartRows.length == 0) return
const targetCartRow = cartRows[rowIndex];
const waitRows = $("#bp_out_wait").datagrid('getRows');
// 车数
for (let i = 0; i < waitRows.length; i++) {
const currentRow = waitRows[i];
if (currentRow.id != targetCartRow.pId) continue;
$("#bp_out_wait").datagrid('updateRow', {
index: i,
row: {
audit_pairs: (parseFloat(currentRow.audit_pairs) + parseFloat(targetCartRow.piece)).toFixed(2),
audit_kilo: (parseFloat(currentRow.audit_kilo) + parseFloat(targetCartRow.kilo)).toFixed(2),
audit_meter: (parseFloat(currentRow.audit_meter) + parseFloat(targetCartRow.meter)).toFixed(2)
}
});
}
$("#bp_out_total").datagrid('deleteRow', rowIndex);// 删除车数分配的行
reorderSerialNo();
detail_compute();
$("#planBill").form('load', {
machineNO: getMachineNO(),
piece: compute('piece', 'bp_out_total'),
kilogram: compute('kilo', 'bp_out_total'),
planMeter: compute('meter', 'bp_out_total')
});
}
搜索本 js 文件的代码 $("#bp_out_total").edatagrid({ 修改原本的 API 为 url: "planBill/getCartQtyAndRK", 搜索本 js 文件的函数 bp_out_del,替换下面代码
//if (wait[i].id == data.fId) {
if (wait[i].id == data.pId) {
批量计划添加车数分配方案的后端实现
2024年6月15日 08:44:04 批量计划单自动领料页面添加车数分配方案的前端实现逻辑在后端制作实现,新增诸多文件
WaitBP- 自动领料页面待扣库白坯 - 左下角表格WaitsAndCart- 待扣库白坯+右下角车数分配方案+标准计量单位的fuse实体类,本类中的车数分配方案非集合,只有一个对象WaitsAndCarts- 是WaitsAndCart在车数分配方案集合化的实体类,更有通用性MultTakeUtils.java- 实现车数分配方案的逻辑工具类,目标是前端调用对应api得到相应数据后填充到左下和右下表格 - 前端不需要做任何计算
本次还为 BpAvgUtils.java 新增了3个参数的方法 getTakeQty,用于在控制器中调用测试。后来没有将制作好的功能应用到前端,留着以后备用。
批量生成计划单附数量汇总扣在一个批次
2024年6月15日 08:43:14 初次反应在天力,现象是在配置项 select * from g_config_oneint where B_GroupName = 'WEB应用_批量计划车数分配方案中自动计算其他计量单位'; 为0的情况下在批量生成计划单的自动领料页面中用户同时输入匹数和公斤并且使用两个批次的白坯,选择按照公斤扣库的方式,会导致匹数全都扣除在第一个批次上(实际第一个批次的匹数不够)第二个批次上只扣除公斤。本次更新了 PlanUtils.java # processDetailbillPlanQty,此时通过工具对比了招商织染的该文件,两个项目完全一致,可以直接覆盖文件。
修改计划单时归还白坯
从计划开单序时表双击打开计划单原单的自动领料页面,删除右下角的车数分配数据时,原本的设计是要归还数量给左下角的待扣表格中对应主键的白坯的,但是在 2024年6月12日 10:04:11 查看源码发现使用车数分配表格的字段 fId 对比左下角待扣白坯的入库主键 id 的逻辑不对,前者记录的是计划领料的明细主键,后者是白坯入库明细的主键,导致永远无法归还白坯,本次更新解决该问题,程序更新点(这里是从序时表双击打开的逻辑) 如果是新制作的计划单,则右下角车数分配表格的 fId 则等于左下角待扣白坯表格的 id,因为在前端页面向右下角表格添加数据时是将白坯入库明细主键写入字段 fId 的,所以在归还白坯时要处理这两种逻辑
# 新增实体类 DetailbillPlanWithRK
# 新增存储过程 usp_getDetailbillPlan8VatNoWithRK
DROP PROCEDURE IF EXISTS `usp_getDetailbillPlan8VatNoWithRK`;
delimiter $
CREATE DEFINER=`root`@`%` PROCEDURE `usp_getDetailbillPlan8VatNoWithRK`(IN inVatNo VARCHAR(100))
BEGIN
# 2024年6月12日 10:15:36
# 在叙事表通过双击打开的计划单原单自动领料右下角车数分配方案的数据源
# 目的为获取关联的白坯入库主键
select a.*,b.pId,b.pId as bprk_id
from detailbill_plan a
left join bpbilldetail b on a.fId = b.id
where vatNO = inVatNo
order by serialNO asc
;
END;$
# DetailbillPlanMapper.xml 新增实体类映射关系 DetailbillPlanWithRKMap,并且新增查询方法 getDetailbillPlan8VatNoWithRK
# 以及上游的服务层、控制器
# 修改JS文件 SC_PlanBill_outputbill.js
第一次为招商织染制作本功能,之后要同步到天力中。
批量回修单同时白坯领料
2024年5月8日 16:38:43 为东诚制作,在原有批量生成回修缸单的基础上追加可以领料白坯的功能:
- 只可为一个批次的白坯领料
- 不管批量生成的回修缸单多少张,系统只为第一个回修缸单生成计划领料(白坯单据)
批量生成回修单的API:planBill/repaired/insertBatch
印花配料单同步调整数到原处方单
2024年4月14日 13:27:23 为天力制作
CraftPrintingPrintlogMapper.xml # selectByPrimaryKeyWithoutBlob检查where字句等号左边是否有主键字段- 新增源码文件
CraftPrintingPrintlogUtils.java - 修改
SystemParamsUtils.java新增方法getAdjust2Prescription以及相关的配置项的常量 - 接口
CraftPrintingDtlService.java新增3个方法:select8FK,selectByExample,get8PrintingDetailId - 修改
CraftPrintingPrintlogDtlServiceImpl.java的所有新增、修改方法,同时修改multiInsert调用本类的方法insertSelective
批量作废计划单
2024年3月25日 13:11:31 为新盛毛纺制作API planBill/invalidBatch
// json post 方法:planBill/invalidBatch
// 参数:["R140325001","R140325002"]
多线程上传客户资料
// 1. 在配置文件 spring-context.xml 配置线程池
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 线程池维护线程的最少数量 -->
<property name="corePoolSize" value="5" />
<!-- 线程池维护线程的最大数量 -->
<property name="maxPoolSize" value="1000" />
<!-- 线程池所使用的缓冲队列 -->
<property name="queueCapacity" value="200" />
<!-- 线程池维护线程所允许的空闲时间 -->
<property name="keepAliveSeconds" value="2000" />
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy" />
</property>
</bean>
// 2. 在控制器 ContactcompanyController.java 中自动注入
@Resource
private TaskExecutor taskExecutor;
// 3. 在控制器 ContactcompanyController.java 中制作上传方法
// 更新客户资料到云端,有则修改,无则新增
private void sync2Cloud(Contactcompany record){
taskExecutor.execute(() -> {
if(!PingUtil.isConnect(remoteServerIp)) return;// 与云端网络不通则不更新
if(!ContactCompanyCategoryEnum.CLIENT.getId().equals(record.getCategory())) return;// 只上传客户
Integer isUpload = 0;
try {
isUpload = Optional.ofNullable(configOneintService.selectBysId(ConfigurationEnum.ISALLOWUPLOADPROCESS.getId())).map(x -> x.getbValue()).orElseGet(() -> 0);
} catch (Exception e) {
logger.info("配置表 g_config_oneint 中没有正确设置项目:WEB应用_是否同步云端客户数据");
}
if(isUpload.equals(0)) return;
try {
clientService.updateByIdAndMill(new Client.Builder().clientName(record.getName()).clientNickname(record.getsId()).build());
} catch (Exception e) {
logger.info("上传客户资料到云端时出现异常!");
}
});
}
// 4. 在控制器 ContactcompanyController.java 中替换之前的方法
// 注意注释掉之前的逻辑
sync2Cloud(contactcompany);// 上传客户资料到云端
批量生成计划单两个API
批量生成计划单API planBill/saveBatch.do 发送给后端的参数
PlanBillBatch{planBill=PlanBill{tubeNum=null, spares01='null', spares02='null', spares03='null', spares04='null', spares05='null', sparei01=null, sparei02=null, sparei03=null, sparei04=null, sparei05=null, spared01=null, spared02=null, spared03=null, spared04=null, spared05=null, sparet01=null, sparet02=null, sparet03=null, sparet04=null, sparet05=null, cpAlias='null', processnamenow='null', processnamenext='null', mainid=null, id=null, date=Fri Apr 05 00:00:00 CST 2024, submitDate=Thu Apr 25 00:00:00 CST 2024, orderNo='240405001', fid=1, pId=null, clientId='LR', tintingTypeId='2', client='null', craftMan='null', alias='利荣', remark='null', priceType='', craftId=6, vatNum='Y24040011', colorClothId='PV绒', bFinished=null, vatBillRemark='', colorClothName='12毛超无光', yd_specification='', sendRemark='', whiteSpecification='1.7', fd_specification='', hg_specification='', cp_specification='有效1.68*1.6平定', colorNoId='Y240001-4/1', color='宠物印花', patternId='', packageRequire='', qualityRequire='', piece=2.0, kilogram=60000.0, fixedKG=null, wayIntoVatSid='', salesMan='', planKilo=null, planMeter=0.0, guessDestory=null, oneToMore='整卷', mid=1, createDate=null, netWeight=null, meter=null, center=null, machineNO=1, netWeightAtube=null, paperTube=0.3, packageWeight=null, empty=null, emptyHidden=0.0, fixedMeter=null, packageType='单袋', roll='', tabStyle='221001', supplier='null', codeBillType='221003', printNum=1, abnormal='', status=null, count=null, bLabelCopies=null, bColorEng='null', printCount=null, calculateState=0, isRelease=null, bQtyFact=null, bPiShuFact=null, bMeterFact=null, releaseDate=null, isOrdered=null, compFashion=0, repaireStation=null, clientCraft='', tubeNumber=null, clientColorno='', clientColor='', merge=null, serialNo=null, increasePrice=0.00, orderCode='', bStarted=null, machinetypeId=null, planType=null, orderdtlIds=[1], pickway=null, detailBill=[DetailbillPlan{id=null, fId=60, vatNO='null', serialNO=1, piece=2.0, kilo=60000.0, meter=null}], greyFabricDetail=[BpBillInfo{id=60, pId=60, vId=null, billCode='BPR2404050031', date=null, billtypeId=null, billtypeName='null', clientId='LR', company='利荣', greyfabricId=2, greyfabric='法兰绒', title='', ordercode='null', kiloheight='null', pairs=100.0, kilo=3000000.0, meter=null, valuateId=null, valuateName='null', price=null, total=null, number=null, cage='', product_name='null', cutterId='null', cutter='null', targetUnitId='null', targetUnit='null', operatorId='null', operator='null', pairNO='P240405050', tip='null', status=null, isOut=null, isVerification=null, deliveryNo='null', maxPieceWeight=null, minPieceWeight=null, avgPieceWeight=null, widthgramme='null', provider01='null', provider02='null', spares01='null', spares02='null', sparei01=null, sparei02=null, spared01=null, spared02=null, sparet01=null, sparet02=null, bpBill=[], detailBill=[], bpbilldetailMsgs=[]}], procedure=[CraftdetailPlan{sId=null, vatNum='null', fId=6, processId='1', process='翻布缝头', remark='null', mark=null, serialNO=1, createDate=null, finishedsign=null}, CraftdetailPlan{sId=null, vatNum='null', fId=6, processId='2', process='缝头', remark='null', mark=null, serialNO=2, createDate=null, finishedsign=null}, CraftdetailPlan{sId=null, vatNum='null', fId=6, processId='3', process='预定', remark='null', mark=null, serialNO=3, createDate=null, finishedsign=null}, CraftdetailPlan{sId=null, vatNum='null', fId=6, processId='20', process='印花', remark='null', mark=null, serialNO=4, createDate=null, finishedsign=null}, CraftdetailPlan{sId=null, vatNum='null', fId=6, processId='21', process='蒸花', remark='null', mark=null, serialNO=5, createDate=null, finishedsign=null}, CraftdetailPlan{sId=null, vatNum='null', fId=6, processId='22', process='水洗', remark='null', mark=null, serialNO=6, createDate=null, finishedsign=null}, CraftdetailPlan{sId=null, vatNum='null', fId=6, processId='17', process='成定打卷', remark='null', mark=null, serialNO=7, createDate=null, finishedsign=null}]}, planMain=PlanMain [Hash = 1757584039, iid=null, parent_id=1, batch_count=1, ps=4, kilo=120000, meter=0, cart_count=2, create_time=null, serialVersionUID=1], distributeList=[MultipleReplicationModel{piece=2.0, kilo=60000.0, meter=null}, MultipleReplicationModel{piece=2.0, kilo=60000.0, meter=null}]}
批量修改计划单API planBill/updateByOrderIdBatch 发送给后端的参数,在2024年4月6日修改原本前端请求发送 form 表单为发送 json 数据
PlanBill{tubeNum=null, spares01='null', spares02='null', spares03='null', spares04='null', spares05='null', sparei01=null, sparei02=null, sparei03=null, sparei04=null, sparei05=null, spared01=null, spared02=null, spared03=null, spared04=null, spared05=null, sparet01=null, sparet02=null, sparet03=null, sparet04=null, sparet05=null, cpAlias='null', processnamenow='null', processnamenext='null', mainid=null, id=null, date=Fri Apr 05 00:00:00 CST 2024, submitDate=Thu Apr 25 00:00:00 CST 2024, orderNo='240405001', fid=1, pId=null, clientId='LR', tintingTypeId='2', client='null', craftMan='null', alias='利荣', remark='null', priceType='', craftId=6, vatNum='Y24040015', colorClothId='PV绒', bFinished=null, vatBillRemark='', colorClothName='12毛超无光', yd_specification='', sendRemark='', whiteSpecification='1.7', fd_specification='', hg_specification='', cp_specification='有效1.68*1.6平定', colorNoId='Y240001-4/1', color='宠物印花', patternId='', packageRequire='', qualityRequire='', piece=2.0, kilogram=60000.0, fixedKG=null, wayIntoVatSid='', salesMan='', planKilo=null, planMeter=0.0, guessDestory=null, oneToMore='整卷', mid=1, createDate=null, netWeight=null, meter=null, center=null, machineNO=1, netWeightAtube=null, paperTube=0.3, packageWeight=null, empty=null, emptyHidden=0.0, fixedMeter=null, packageType='单袋', roll='', tabStyle='221001', supplier='null', codeBillType='221003', printNum=1, abnormal='', status=null, count=null, bLabelCopies=null, bColorEng='null', printCount=null, calculateState=0, isRelease=null, bQtyFact=null, bPiShuFact=null, bMeterFact=null, releaseDate=null, isOrdered=null, compFashion=null, repaireStation=null, clientCraft='', tubeNumber=null, clientColorno='', clientColor='', merge=null, serialNo=null, increasePrice=0.00, orderCode='', bStarted=null, machinetypeId=null, planType=null, orderdtlIds=null, pickway=null, detailBill=[], greyFabricDetail=[], procedure=[CraftdetailPlan{sId=140, vatNum='Y24040015', fId=6, processId='1', process='翻布缝头', remark='null', mark=null, serialNO=1, createDate=null, finishedsign=null}, CraftdetailPlan{sId=145, vatNum='Y24040015', fId=6, processId='22', process='水洗', remark='null', mark=null, serialNO=6, createDate=null, finishedsign=null}, CraftdetailPlan{sId=141, vatNum='Y24040015', fId=6, processId='2', process='缝头', remark='null', mark=null, serialNO=2, createDate=null, finishedsign=null}, CraftdetailPlan{sId=142, vatNum='Y24040015', fId=6, processId='3', process='预定', remark='null', mark=null, serialNO=3, createDate=null, finishedsign=null}, CraftdetailPlan{sId=143, vatNum='Y24040015', fId=6, processId='20', process='印花', remark='null', mark=null, serialNO=4, createDate=null, finishedsign=null}, CraftdetailPlan{sId=144, vatNum='Y24040015', fId=6, processId='21', process='蒸花', remark='null', mark=null, serialNO=5, createDate=null, finishedsign=null}, CraftdetailPlan{sId=146, vatNum='Y24040015', fId=6, processId='17', process='成定打卷', remark='null', mark=null, serialNO=7, createDate=null, finishedsign=null}]}
批量页面可修改
制作
2024年3月14日 12:42:01 首次为东诚制作,在批量生成计划单的页面可在保存后立即修改,逻辑为修改当前订单明细主键下的所有缸单,不会修改缸单的创建日期和客户(动态 sql 中注释了这两个字段),源码做的修改如下:
// sql文件 PlanBillMapper.xml 新建方法
<!-- 2024年3月12日 10:11:59 根据客户订单明细主键批量修改缸单 -->
<update id="updateByFidSelective" parameterType="account.entity.PlanBill">
update plan
<set>
<if test="pId != null">
pId = #{pId,jdbcType=INTEGER},
</if>
<if test="tintingTypeId != null and tintingTypeId!=''">
tintingTypeId = #{tintingTypeId,jdbcType=VARCHAR},
</if>
<!-- 防止修改之前的计划单的创建日期 - 会将前几天的计划单的制作日期修改为当天引起误解
<if test="date != null">`date` = #{date,jdbcType=TIMESTAMP},</if>
-->
<if test="createDate != null">
createDate = #{createDate,jdbcType=TIMESTAMP},
</if>
<if test="submitDate != null">
submitDate = #{submitDate,jdbcType=TIMESTAMP},
</if>
<!-- 不修改客户
<if test="clientId != null and clientId!=''">clientId = #{clientId,jdbcType=VARCHAR},</if>
-->
<if test="supplier != null and supplier!=''">
supplier = #{supplier,jdbcType=VARCHAR},
</if>
<if test="whiteSpecification != null">
whiteSpecification = #{whiteSpecification,jdbcType=VARCHAR},
</if>
<if test="orderNo != null">
orderNo = #{orderNo,jdbcType=VARCHAR},
</if>
<if test="colorClothId != null">
colorClothId = #{colorClothId,jdbcType=VARCHAR},
</if>
<if test="colorClothName != null">
colorClothName = #{colorClothName,jdbcType=VARCHAR},
</if>
<if test="yd_specification != null">
yd_specification = #{yd_specification,jdbcType=VARCHAR},
</if>
<if test="fd_specification != null">
fd_specification = #{fd_specification,jdbcType=VARCHAR},
</if>
<if test="hg_specification != null">
hg_specification = #{hg_specification,jdbcType=VARCHAR},
</if>
<if test="cp_specification != null">
cp_specification = #{cp_specification,jdbcType=VARCHAR},
</if>
<if test="colorNoId != null">
colorNoId = #{colorNoId,jdbcType=VARCHAR},
</if>
<if test="piece != null">
piece = #{piece,jdbcType=DECIMAL},
</if>
<if test="kilogram != null">
kilogram = #{kilogram,jdbcType=DECIMAL},
</if>
<if test="fixedMeter != null">
fixedMeter = #{fixedMeter,jdbcType=DECIMAL},
</if>
<if test="fixedKG != null">
fixedKG = #{fixedKG,jdbcType=DECIMAL},
</if>
<if test="wayIntoVatSid != null and wayIntoVatSid!=''">
wayIntoVatSid = #{wayIntoVatSid,jdbcType=VARCHAR},
</if>
<if test="salesMan != null and salesMan!=''">
salesMan = #{salesMan,jdbcType=VARCHAR},
</if>
<if test="craftId != null and craftId!=''">
craftId = #{craftId,jdbcType=INTEGER},
</if>
<if test="remark != null">
remark = #{remark,jdbcType=VARCHAR},
</if>
<if test="alias != null">
alias = #{alias,jdbcType=VARCHAR},
</if>
<if test="color != null">
color = #{color,jdbcType=VARCHAR},
</if>
<if test="patternId != null">
patternId = #{patternId,jdbcType=VARCHAR},
</if>
<if test="packageRequire != null">
packageRequire = #{packageRequire,jdbcType=VARCHAR},
</if>
<if test="qualityRequire != null">
qualityRequire = #{qualityRequire,jdbcType=VARCHAR},
</if>
<if test="planKilo != null">
planKilo = #{planKilo,jdbcType=DECIMAL},
</if>
<if test="planMeter != null">
planMeter = #{planMeter,jdbcType=DECIMAL},
</if>
<if test="guessDestory != null">
guessDestory = #{guessDestory,jdbcType=DECIMAL},
</if>
<if test="oneToMore != null">
oneToMore = #{oneToMore,jdbcType=VARCHAR},
</if>
<if test="pickway != null">
pickway = #{pickway,jdbcType=INTEGER},
</if>
<choose>
<when test="mid != null">mid = #{mid,jdbcType=INTEGER},</when>
<otherwise>mid = 0,</otherwise>
</choose>
<choose>
<when test="netWeight != null">netWeight = #{netWeight,jdbcType=INTEGER},</when>
<otherwise>netWeight = 0,</otherwise>
</choose>
<choose>
<when test="meter != null">meter = #{meter,jdbcType=INTEGER},</when>
<otherwise>meter = 0,</otherwise>
</choose>
<choose>
<when test="center != null">center = #{center,jdbcType=INTEGER},</when>
<otherwise>center = 0,</otherwise>
</choose>
<if test="machineNO != null">
machineNO = #{machineNO,jdbcType=VARCHAR},
</if>
<choose>
<when test="netWeightAtube != null">netWeightAtube = #{netWeightAtube,jdbcType=INTEGER},</when>
<otherwise>netWeightAtube = 0,</otherwise>
</choose>
<if test="paperTube != null">
paperTube = #{paperTube,jdbcType=DOUBLE},
</if>
<if test="packageWeight != null">
packageWeight = #{packageWeight,jdbcType=DOUBLE},
</if>
<if test="empty != null">
`empty` = #{empty,jdbcType=DOUBLE},
</if>
<if test="emptyHidden != null">
emptyHidden = #{emptyHidden,jdbcType=DOUBLE},
</if>
<if test="packageType != null">
packageType = #{packageType,jdbcType=VARCHAR},
</if>
<if test="roll != null">
roll = #{roll,jdbcType=VARCHAR},
</if>
<if test="tabStyle != null">
tabStyle = #{tabStyle,jdbcType=VARCHAR},
</if>
<if test="codeBillType != null and codeBillType!=''">
codeBillType = #{codeBillType,jdbcType=VARCHAR},
</if>
<if test="printNum != null">
printNum = #{printNum,jdbcType=INTEGER},
</if>
<if test="abnormal != null">
abnormal = #{abnormal,jdbcType=VARCHAR},
</if>
<if test="priceType != null">
priceType = #{priceType,jdbcType=VARCHAR},
</if>
<if test="vatBillRemark != null">
vatBillRemark = #{vatBillRemark,jdbcType=VARCHAR},
</if>
<if test="sendRemark != null">
sendRemark = #{sendRemark,jdbcType=VARCHAR},
</if>
<if test="status != null">
`status` = #{status,jdbcType=INTEGER},
</if>
<if test="bLabelCopies != null">
B_LabelCopies = #{bLabelCopies,jdbcType=INTEGER},
</if>
<if test="bColorEng != null">
B_ColorEng = #{bColorEng,jdbcType=VARCHAR},
</if>
<if test="calculateState != null">
calculateState = #{calculateState,jdbcType=INTEGER},
</if>
<if test="printCount != null">
printCount = #{printCount,jdbcType=INTEGER},
</if>
<if test="isOrdered != null">
isOrdered = #{isOrdered,jdbcType=INTEGER},
</if>
<if test="bQtyFact != null">
B_QtyFact = #{bQtyFact,jdbcType=REAL},
</if>
<if test="bPiShuFact != null">
B_PiShuFact = #{bPiShuFact,jdbcType=REAL},
</if>
<if test="releaseDate != null">
releaseDate = #{releaseDate,jdbcType=TIMESTAMP},
</if>
<if test="isRelease != null">
isRelease = #{isRelease,jdbcType=TINYINT},
</if>
<if test="bFinished != null">
B_finished = #{bFinished,jdbcType=INTEGER},
</if>
<if test="repaireStation != null">
repaireStation = #{repaireStation,jdbcType=INTEGER},
</if>
<if test="compFashion != null">
compFashion = #{compFashion,jdbcType=INTEGER},
</if>
<if test="clientCraft != null">
clientCraft = #{clientCraft,jdbcType=VARCHAR},
</if>
<if test="tubeNumber != null">
tube_number = #{tubeNumber,jdbcType=DOUBLE},
</if>
<if test="clientColorno != null">
client_colorno = #{clientColorno,jdbcType=VARCHAR},
</if>
<if test="increasePrice != null">
increase_price = #{increasePrice,jdbcType=DECIMAL},
</if>
<if test="clientColor != null">
client_color = #{clientColor,jdbcType=VARCHAR},
</if>
<if test="orderCode != null">
order_code = #{orderCode,jdbcType=VARCHAR},
</if>
<if test="bStarted != null">
b_Started = #{bStarted,jdbcType=INTEGER},
</if>
<if test="machinetypeId != null">
machinetype_id = #{machinetypeId,jdbcType=INTEGER},
</if>
<if test="planType != null">
plan_type = #{planType,jdbcType=INTEGER},
</if>
</set>
<where>
fid = #{fid,jdbcType=INTEGER}
</where>
</update>
// 向上创建执行链,直到控制器 PlanBillController.java
/**
* 2024年3月12日 13:15:01
* 本API来自 updateByOrderId ,保留原始前端数据进行修改
* 最初使用了 service.updateByOrderId()修改数据,发现没有修改对应的缸单(只修改了发货单)
* 后来使用自定义的方法先修改缸单在修改发货单并且记录修改日志
* @param planBill
* @return
* @throws Exception
*/
@RequestMapping(value = "/updateByOrderIdBatch", method = RequestMethod.POST)
@RequiresUser
public ResponseResult<Integer> updateByOrderIdBatch(PlanBill planBill) throws Exception {
return new ResponseResult<>(ResultCode.OK.getCode(),"批量修改计划单成功!",service.updateByFidSelective(planBill));
}
// 前端文件 SC_FlatPlanBill_new.js 中在头上声明下面代码
// 注意本文件中部已经声明了 status,要将之前的代码删除
// ********** 2024年3月14日 09:30:52 新增 ****************
var status = 0; //单据状态:0:新增状态;1:保存;2:作废;3:修改
/**
* 对应表 plan_main 的数据,只有在批量生成计划单成功后会填充该属性
* 可根据本变量判断当前页面是否已经成功生成过计划单了
*/
let planMainId = 0;
// 然后在本 js 文件最后添加下面代码,并删除之前的函数 btn_savedata_new(下面代码中已重构)
// 批量修改计划单
function updateBatch(){
if(billOrderDetailId === 0){
$.messager.alert('提示', '关联的客户订单不存在,无法修改!', 'warning');
return
}
const planFormData = $('#planBill').serializeObject();
$.ajax({
url: 'planBill/updateByOrderIdBatch',
type: 'post',
data: planFormData,
traditional: true,
dataType: 'json',
success: function (res) {
if(!res) return
const state = parseInt(res.state);
if(state === 1){// 修改成功
setStatus(1);
disableFormAllControl($("#planBill"));
}else{
$.messager.alert("提示", res.message);
}
}
})
}
/**
* 保存数据,批量生成计划单 或者 批量修改计划单
* 根据变量 planMainId 区分新增或者修改
*/
function insertOrUpdate(){
if(!planMainId || planMainId <= 0) insertBatch();// 批量新增
else updateBatch();// 批量修改
}
function insertBatch(){
// 取领料页面右下角表格的第一行数据填充到“要素”页面的几个数量
if(!fillPlanFirstRow()){
$.messager.alert({title:'错误',msg:'领料页面没有正确设置批量生成的数量!'});
return;
}
const greyFabricDetail = $("#bp_out_wait").length > 0 ? $("#bp_out_wait").datagrid("getData").rows : null;// 准备待领料的白坯
const procedure = $("#template2").length > 0 ? $("#template2").datagrid("getData").rows : null;// 工序工艺
// var detailBill = $("#bp_out_total").length > 0 ? $("#bp_out_total").datagrid("getData").rows : null;
const detailBill = getSpendBP8SinglePlan();// 在工具类 SC_PlanBill_Dye_Utils_New.js 中构建一个计划单使用的白坯用于生成一张计划单
/**
* 单据状态:0:新增状态;1:保存;2:作废;3:修改
* 只有新增、修改状态继续执行,其他状态则直接退出
*/
if (status != 0 && status != 3) return;
//var url = status == 0 ? 'planBill/save.do' : 'planBill/update.do'
const url = parseInt(status) == 0 ? 'planBill/saveBatch.do' : 'planBill/updateBatch.do';
var opts = $("#bp_out").datagrid('getColumnFields');
var planBillstr=$('#planBill').serializeObject()
// console.log(planBillstr)
//2022年11月12日12:50:23
//因为添加白坯筛选功能 导致获取全局表单数据时,把白坯库存表中用于筛选的文本框字段也获取到了,导致一些字段重复
//做下面的一个for方法 去除表单获取数据时 白坯库存生成的文本框内容 重复的修改
for (let i=0;i<opts.length;i++){
if (Array.isArray(planBillstr[opts[i]])){
planBillstr[opts[i]]=planBillstr[opts[i]][0]
}else{
delete planBillstr[opts[i]];
}
}
if (status == 3) {
$.messager.confirm('提示', '修改计划单会影响刷卡产量,是否修改计划单?', function (r) {
if (r) doValid();
})
} else {
$.ajax({
// url: 'tools/isServerTime/' + $('#planBill').serializeObject().date,
url: 'tools/isServerTime/' + planBillstr.date,
type: 'GET',
dataType: 'json'
}).then(function (data) {
if (data.data) {
doSave(greyFabricDetail, procedure, detailBill, url);
} else {
$.messager.confirm('提示', '当前日期与服务器日期不同,确认保存?', function (r) {
if (r) {
doSave(greyFabricDetail, procedure, detailBill, url);
}
});
}
});
}
// 修改验证
function doValid() {
$.messager.prompt({
title: '输入密码',
msg: '请输入当前用户密码:',
fn: function (r) {
if (r != undefined)
$.post('user/confirm/pwd', {pwd: r}, function (data) {
if (data.state == 200) {
doSave(greyFabricDetail, procedure, detailBill, url);
} else
$.messager.alert({
title: '提示',
msg: '密码错误!',
icon: 'error',
fn: function () {
doValid();
}
});
}, 'json')
}
});
$('.messager-input').attr('type', 'password');
}
/**
* 执行生成计划单的函数
* @param greyFabricDetail 待领料白坯数据 - 多个批次
* @param procedure 工序工艺
* @param detailBill 即将生成的第一个计划单使用的白坯 - 可能多个批次
* @param url 新增/修改 url
*/
function doSave(greyFabricDetail, procedure, detailBill, url) {
$("#savedata").linkbutton("disable");
if ($('#planBill').form("validate")) {
// 根据自动领料页面的数量更新本缸计划数量
// updatePlanAmount();
// var para = $('#planBill').serializeObject();
let para =planBillstr; // $('#planBill').serializeObject();
// 汇总分车的数量填充到“要素”页面的数量上
// 2022年5月21日 17:29:23 部署zipper,之后继续做这里
const totalPiece = detailBill.reduce((pre,curr) => pre + (curr.piece||0),0);
const totalKilo = detailBill.reduce((pre,curr) => pre + (curr.kilo||0),0);
const totalMeter = detailBill.reduce((pre,curr) => pre + (curr.meter||0),0);
para.piece = totalPiece;
para.kilogram = totalKilo;
para.planMeter = totalMeter;
// 设置默认是自动扣库模式 - 批量生成必定是自动扣库
para.compFashion = 0;
para.detailBill = detailBill;// 右下角表格领料明细
para.greyFabricDetail = greyFabricDetail;// 待扣库白坯
para.procedure = procedure;// 工序工艺
para.orderdtlIds = ORDERDETAIL_IDS;
const planMain = getPlanMain();
planMain.parent_id = para.fid;// 为 plan_main 设置字段 parent_id = billorderdetai 的主键
// 2022年5月20日 16:25:37 新制作了批量生成的方法,新增了属性 List<MultipleReplicationModel>
// 即将领料页面右下角表格所有行数据传入即可
const distributeList = $('#bp_out_total').edatagrid('getRows') || [];
const batchParam = {planBill:para,planMain:planMain,distributeList:distributeList};
$.messager.progress({title: '提示', text: '请稍候...', interval: 5000});
$.ajax({
url: url,
// data: JSON.stringify(para), 批量生成模式下传递的参数是在原模式参数上再套一层
data: JSON.stringify(batchParam),
type: 'post',
dataType: 'json',
contentType: 'application/json',
success: function (res) {
// 2022年4月29日 16:10:35 重构后注释下面多行代码
setStateAfterSave(res);
},
error: function (e) {
$.messager.alert("提示", "连接服务器失败", "warning");
$("#savedata").linkbutton("enable");
},
complete: function(){
$.messager.progress('close');
}
});
} else {
$("#savedata").linkbutton("enable");
$.messager.show({title: '提示', msg: '请在【要素】标签页中填写完整后再保存!'});
}
}
}
// 2022年5月18日 15:05:44 新制作的批量生成计划单保存函数
function btn_savedata_new() {
insertOrUpdate();// 批量新增、批量修改
}
批量修改策略
初次为东诚制作
# 新增配置项
INSERT INTO pademisaccount.g_config_oneint (B_GroupName, B_Value, B_Des) VALUES ('WEB应用_批量生成计划单页面的修改策略', 3, '0禁用,1修改订单明细主键下的所有计划单,2修改本批次一同生成的所有计划单,3修改本批次一同生成的所有计划单非数量要素');
# java源码修改 PlanBillServiceImpl.java # updateByFidSelective,同时新增了 updateByFidSelective2,updateByFidSelective3
线程池
配置文件 spring-context.xml 中设置线程池参数
<!-- 2024年2月20日 14:08:42 自定义线程池 -->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<!-- 线程池维护线程的最少数量 -->
<property name="corePoolSize" value="2" />
<!-- 线程池维护线程的最大数量 -->
<property name="maxPoolSize" value="1000" />
<!-- 线程池所使用的缓冲队列 -->
<property name="queueCapacity" value="200" />
<!-- 线程池维护线程所允许的空闲时间 -->
<property name="keepAliveSeconds" value="2000" />
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy" />
</property>
</bean>
在业务代码中的使用:
@Resource
private TaskExecutor taskExecutor;
taskExecutor.execute(() -> {
try {
if (PingUtil.isConnect(remoteServerIp) &&
ContactCompanyCategoryEnum.CLIENT.getId().equals(contactcompany.getCategory()) &&
Optional.ofNullable(configOneintService.selectBysId(ConfigurationEnum.ISALLOWUPLOADPROCESS.getId())).map(x -> x.getbValue()).orElseGet(() -> 0) > 0) {
try {
clientService.save(new Client.Builder().clientNickname(contactcompany.getsId()).clientName(contactcompany.getName()).build());
} catch (Exception e) {
logger.error("往来单位客户添加出现问题," + e.getMessage());
}
}
} catch (Exception e) {
throw new RunTimeErrorException("新增客户后同步到云端时出现异常!");
}
});
注意有的老项目在配置文件中没有使用最新的 mysql 端口号和密码,修改后再测试
计划单自动领料显示当前批次白坯
记录日期:2024年3月1日 12:37:16,首次应用在东诚,通过序时表打开计划单后在“自动领料”中无条件显示本计划单使用的白坯(不管待扣数量是否为0),配合开启 “计划领料允许负库存” 可以实现没有待扣数量时可修改使用的白坯批次,包含情况:
- 修改前已用清当前批次,本次修改要减少使用量
- 更改当前使用的白坯批次
源码及SQL脚本的变更:
在
dao文件BpBillDetailDAO.java中制作新的方法:根据缸号查询获取使用白坯批次:List<BpBillInfo> getVatNoPlanWhite(String vatNo);对应的 xml 文件
BpBillDetailMapper.xml中新增下面代码:<select id="getVatNoPlanWhite" parameterType="java.lang.String" resultMap="BpBillDetailMap"> call usp_getVatNoPlanWhite(#{vatNo,jdbcType=VARCHAR}); </select>关联的增存储过程:
create definer = root@`%` procedure usp_getVatNoPlanWhite(IN vVatNo varchar(100)) BEGIN # 2024年2月27日 13:27:20 根据缸单号查询获取使用的白坯批次信息 SELECT * from bpbilldetail where id in( select pId from bpbilldetail where id in ( select fId from detailbill_plan where vatNO=vVatNo )); END;xml文件BpRepositoryMapper.xml中新增SQL脚本<select id="findGreyFabricReposityByClientIdArrayWithVatWhite" resultType="account.entity.GreyFabricReposity"> select * from r_bpBill <where> <if test="clientIdArr != null"> and clientId in <foreach collection="clientIdArr" item="i" open="(" close=")" separator=","> #{i,jdbcType=VARCHAR} </foreach> </if> <if test="isShow != null"> and ( ( pairNO not in <foreach collection="batchNoArr" item="i" open="(" close=")" separator=","> #{i,jdbcType=VARCHAR} </foreach> AND (audit_pairs>0 or audit_kilo>0 or audit_meter>0) ) OR pairNO in <foreach collection="batchNoArr" item="i" open="(" close=")" separator=","> #{i,jdbcType=VARCHAR} </foreach> ) </if> </where> order by id desc </select>同时为关联文件
BpRepositoryDAO.java新增对应的方法:// 计划单自动领料页面白坯库存数据源,无条件包含本计划单使用的白坯批次号(可用数为0也会显示) List<GreyFabricReposity> findGreyFabricReposityByClientIdArrayWithVatWhite(@Param(value = "clientIdArr") String[] clientIdArr, @Param(value = "batchNoArr") String[] batchNoArr, @Param("isShow") Integer isShow);制作接口和服务,文件
BpRepositoryService.java新增接口List<GreyFabricReposity> findGreyFabricReposityByClientIdArrayWithVatWhite(String vatNo,String[] clientIdArr, Integer isShow);实现类
BpRepositoryServiceImpl.java新增方法,记得在本源码文件中声明依赖注入@Autowired private BpBillDetailDAO bpBillDetailDAO; // 计划单自动领料页面白坯库存数据源,无条件包含本计划单使用的白坯批次号(可用数为0也会显示) @Override public List<GreyFabricReposity> findGreyFabricReposityByClientIdArrayWithVatWhite(String vatNo,String[] clientIdArr, Integer isShow){ List<BpBillInfo> batchNoList = bpBillDetailDAO.getVatNoPlanWhite(vatNo); List<String> batchNoStrList = batchNoList.stream().map(item -> item.getPairNO()).collect(Collectors.toList()); String[] batchNoArr = batchNoStrList.stream().toArray(String[]::new); return dao.findGreyFabricReposityByClientIdArrayWithVatWhite(clientIdArr, batchNoArr, isShow); }控制器
BpRepositoryController.java中新增接口@RequestMapping(value = "/getReposityByClientIdArrayWithVatWhite", method = {RequestMethod.GET, RequestMethod.POST}) public List<GreyFabricReposity> getReposityByClientIdArrayWithVatWhite( @RequestParam(value = "billOrderDetailId", required = true) Integer billOrderDetailId, @RequestParam(value = "vatNo", required = true) String vatNo, Integer isShow) throws Exception { Billorderdetail billorderdetail = billorderdetailBo.selectById(billOrderDetailId); if(billorderdetail == null ) throw new BusinessException("没有找到主键是【" + billOrderDetailId + "】的订单明细"); String billCode = billorderdetail.getBillCode(); Billordermain billordermain = billordermainBo.findByBillCode(billCode); if(billordermain == null) throw new BusinessException("没有找到单据编号是【" + billCode + "】的订单" ); String workingClientId = billordermain.getWorkingClientId(); if(workingClientId == null || workingClientId.length() == 0) throw new BusinessException("订单没有设置【坯布来源】"); List<String> clientList = new ArrayList<>(); clientList.add(workingClientId); clientList = appendSameClients(clientList,workingClientId); return service.findGreyFabricReposityByClientIdArrayWithVatWhite(vatNo,clientList.stream().toArray(String[]::new), isShow); }修改前端调用的API
SC_DyePlanBill_Out.html关联的 js文件SC_PlanBill_outputbill.js:// 在 js 文件开始位置声明全局变量 let m_vatNo = '';// 当前页面的缸号 // 在初始化后立即运行的函数中添加第一行代码,获取当前缸号 m_vatNo = $("#vatNum").textbox('getValue'); // 搜索 url: "bpreposity/select_by_client_source", 后替换请求的API以及参数 url: "bpreposity/getReposityByClientIdArrayWithVatWhite", queryParams: { billOrderDetailId: parseInt(billOrderDetailId), vatNo:m_vatNo, isShow: 1 },
微信
染厂更名
set @oldName = '华森印染';
set @newName = '莫岚迪(南通)纺织';
update mill set sid = @newName where sid = @oldName;
update client set mill = @newName where mill = @oldName;
update user_mill set mill = @newName where mill = @oldName;
update sys_userpermission set mill = @newName where mill = @oldName;
用户数
# 清除染厂所有相关数据
DELIMITER $$
start TRANSACTION ;
set @mill = '天力印染';
DELETE from sys_userpermission where mill = @mill;
delete from user_convent where user_weixin_id in (
select id from user_weixin where left(qr_scene_str,CHAR_LENGTH(@mill) + 1) = concat(@mill,',')
);
delete from user_weixin where left(qr_scene_str,CHAR_LENGTH(@mill) + 1) = concat(@mill,',');
delete from user_mill where mill = @mill;
delete from client where mill = @mill;
delete from mill where sid = @mill;
COMMIT ;
$$
推送
年中开启推送服务的话,会有积累的N多没有推送的数据,造成开启服务后微信一直接受到今年从第一笔开始的所有未推送的数据,不仅客户体验不好,还有可能导致云端服务器微信后台在一天推送过多消息导致被微信公司限流,今日新发生的需要推送的数据都无法推送了。所以要开启这个服务需要注意一下几点
- 线下服务器工序产量表
g_cjflowbilldetailprocess中有字段JudgeUpload记录当前行数据是否已经上传 - 染厂线下服务器后台有服务
data_transmitter定时查询并上传没有上传过的数据,供其推送微信消息使用 - 所以开启服务之前先要将
erp中的历史数据,不想要推送的旧数据都手动标记为已上传,再重启服务data_transmitter - 在云端的染厂云服务器中删除当前染厂所有等待推送的历史数据
- 厂内线下服务器中调用下面脚本设置所有客户推送所有工序
# MYSQL
DROP PROCEDURE IF EXISTS `usp_setWechatPushAllClientAllProcess`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_setWechatPushAllClientAllProcess`()
BEGIN
# 先清除所有客户的所有工序映射关系
# 再批量写入多个工序的映射关系
start TRANSACTION ;
set @processNames = (Select group_concat(name) name FROM process);
TRUNCATE TABLE process_mapping;
INSERT INTO process_mapping
(client_id, client_name, process_name)
SELECT a.sId,a.name,b.processName
FROM contactcompany a
cross JOIN (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@processNames,',',help_topic_id+1),',',-1) AS processName
FROM mysql.help_topic
WHERE help_topic_id < LENGTH(@processNames)-LENGTH(REPLACE(@processNames,',',''))+1
) b on 1=1
WHERE 1=1
;
COMMIT ;
END;$
- 批量设置当前染厂客户跟单的微信接收推送消息的配置开关
在 2025年8月13日 已在染厂云服务器创建下面存储过程,用于删除指定日期之前的刷卡数据,调用方法 CALL batch_delete_push_data(100,'2025-05-01:00:00:00'); 表示删除这个日期之前的所有工序数据,循环30次,如果提前删除完毕会提前退出循环并打印 Finished. Total batches executed: 1 即使没有数据也会执行一次循环。注意会同时删除:白坯、成品、工序,三个部分的推送数据
DROP PROCEDURE batch_delete_push_data;
DELIMITER //
CREATE PROCEDURE batch_delete_push_data(IN loopCounts INT,IN finishDateStr VARCHAR(100))
BEGIN
DECLARE rows_affected INT;
DECLARE counter INT DEFAULT 0;
DECLARE sendout_main_id INT;
-- 添加循环标签
batch_loop: WHILE counter < loopCounts DO
# 删除推送工序
DELETE FROM client_pushlist
WHERE finish_date < finishDateStr
LIMIT 50000;
DELETE FROM client_pushlist_detail
WHERE finish_date < finishDateStr
LIMIT 50000;
# 删除推送白坯入库
delete from bp_pushlist_main where create_time < finishDateStr LIMIT 50000;
delete from bp_pushlist_dtl where create_time < finishDateStr LIMIT 50000;
# 删除推送成品发货
# ===============================
set sendout_main_id = (
select id from (
select id from sendout_main
where create_date < finishDateStr
LIMIT 50000
) a
ORDER BY id DESC LIMIT 1
);
delete from sendout_dtl where parent_id <= sendout_main_id;
delete from sendout_main where id <= sendout_main_id;
# ===============================
SET rows_affected = ROW_COUNT();
SET counter = counter + 1;
-- 如果没有数据可删,提前退出循环
IF rows_affected = 0 THEN
LEAVE batch_loop; -- 使用循环标签
END IF;
-- 可选:打印日志
#SELECT CONCAT('Batch ', counter, ': Deleted ', rows_affected, ' rows') AS log;
-- 可选:短暂暂停
DO SLEEP(1);
END WHILE batch_loop; -- 结束循环标签
SELECT CONCAT('Finished. Total batches executed: ', counter) AS result;
END //
DELIMITER ;
- 在ERP端设置指定客户推送所有工序(ERP中刷卡后只推送这些工序的产量到云服务器),传入参数是客户编号
=contactcompany.client_id
# MYSQL
DROP PROCEDURE IF EXISTS `usp_setClientProcessAll`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_setClientProcessAll`(IN clientSid VARCHAR(100))
BEGIN
# 2024年10月17日 13:27:21 设置客户推送所有工序
# 传入参数是客户编号 = contactcompany.client_id,不是该表的主键
# 1. 先删除该客户当前的工序映射关系
delete from process_mapping where client_id = clientSid;
# 2. 查询获取客户资料
select `sId`,`name` into @sId,@name from contactcompany where sId = clientSid;
# 2. 再重新添加
INSERT INTO process_mapping
(client_id, client_name, process_name)
SELECT @sId,@name,a.name AS process_name
FROM process a
WHERE 1=1
;
END;$
手机微信端是否显示工序产量是字段
process.shouldWechatShowERP内设置所有用户推送指定的工序,调用方法
call usp_setWechatPushAllClientOneProcess('翻布')# MYSQL DROP PROCEDURE IF EXISTS `usp_setWechatPushAllClientOneProcess`; delimiter $ # 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程 CREATE DEFINER=`root`@`%` PROCEDURE `usp_setWechatPushAllClientOneProcess`(IN processName VARCHAR(100)) BEGIN # 2024年12月5日 10:42:22 INSERT INTO process_mapping (client_id, client_name, process_name) SELECT a.sId,a.name,processName FROM contactcompany a WHERE 1=1 ; END;$设置所有客户默认推送N多工序,调用方法
call usp_setWechatPushAllClientNProcess('翻布,白坯预定')
# MYSQL
DROP PROCEDURE IF EXISTS `usp_setWechatPushAllClientNProcess`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_setWechatPushAllClientNProcess`(IN processNames VARCHAR(100))
BEGIN
# 先清除所有客户的所有工序映射关系
# 再批量写入多个工序的映射关系
start TRANSACTION ;
TRUNCATE TABLE process_mapping;
INSERT INTO process_mapping
(client_id, client_name, process_name)
SELECT a.sId,a.name,b.processName
FROM contactcompany a
cross JOIN (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(processNames,',',help_topic_id+1),',',-1) AS processName
FROM mysql.help_topic
WHERE help_topic_id < LENGTH(processNames)-LENGTH(REPLACE(processNames,',',''))+1
) b on 1=1
WHERE 1=1
;
COMMIT ;
END;$
设置所有客户推送所有工序,直接调用没有参数
# MYSQL
DROP PROCEDURE IF EXISTS `usp_setWechatPushAllClientAllProcess`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_setWechatPushAllClientAllProcess`()
BEGIN
# 先清除所有客户的所有工序映射关系
# 再批量写入多个工序的映射关系
start TRANSACTION ;
set @processNames = (Select group_concat(name) name FROM process);
TRUNCATE TABLE process_mapping;
INSERT INTO process_mapping
(client_id, client_name, process_name)
SELECT a.sId,a.name,b.processName
FROM contactcompany a
cross JOIN (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@processNames,',',help_topic_id+1),',',-1) AS processName
FROM mysql.help_topic
WHERE help_topic_id < LENGTH(@processNames)-LENGTH(REPLACE(@processNames,',',''))+1
) b on 1=1
WHERE 1=1
;
COMMIT ;
END;$
错误与提示
IDEA启动项目失败
从云端下载来的新代码在 File > Project Structure 中设置,并添加了 tomcat 源码运行后报错
org.apache.catalina.core.StandardContext.startInternal 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件 org.apache.catalina.core.StandardContext.startInternal 由于之前的错误,Context[/PADEMIS]启动失败 org.apache.catalina.core.StandardContext.listenerStart 异常将上下文初始化事件发送到类的侦听器实例.[org.springframework.web.context.ContextLoaderListener] org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [Spring/spring-context.xml]; nested exception is java.io.FileNotFoundException: class path resource [Spring/spring-context.xml] cannot be opened because it does not exist
提示将项目部署到了目录:webapps\manager 下
等等类似上面的报错,问题出在 maven 上,这种情况一般发生于 IDEA 在索引文件、下载依赖、下载插件过程中(还没有结束)就通过 File > Settings 中更换为使用自己下载并解压的 maven 管理本项目导致的。
解决方法是将 maven 的配置文件(在 home硬件的:\\192.168.66.118\homeWin7new6t\setup\Dev\web开发\WebDyeErpIDEAMaven配置文件\settings.xml)拷贝到 IDEA 默认集成的 maven 下(C:\Users\admin\.m2 目录下)作为配置文件,重新下载源码等待自动执行完毕:下载依赖、下载插件、索引文件。
工序与产量相关
ERP用户工序权限
# 为指定用户赋予指定工序的权限,之后可以在 “车间生产完工表” 中保存产量
DROP PROCEDURE IF EXISTS `usp_setUserProcessPermission`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_setUserProcessPermission`(IN userName VARCHAR(100), IN processName VARCHAR(100))
BEGIN
# 2024年11月23日 13:46:17
# 为指定用户赋予指定工序的权限,之后可以在 “车间生产完工表” 中保存产量
set @processId = (SELECT sId from process where name = processName);
set @userId = (select sId from user where name = userName);
START TRANSACTION;
delete from sys_user_process_permission where user_sid = @userId and process_sid = @processId;
insert into sys_user_process_permission
(process_sid, user_sid, can_add, can_update, can_delete, can_view)
VALUES
(@processId,@userId,1,1,1,1);
COMMIT;
END;$
# 为指定用户赋予所有工序的权限,之后可以在 “车间生产完工表” 中保存产量
DROP PROCEDURE IF EXISTS `usp_setUserProcessPermissionAll`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_setUserProcessPermissionAll`(IN userName VARCHAR(100))
BEGIN
# 2024年11月23日 13:46:17
# 为指定用户赋予指定工序的权限,之后可以在 “车间生产完工表” 中保存产量
set @userId = (select sId from user where name = userName);
START TRANSACTION;
delete from sys_user_process_permission where user_sid = @userId;
insert into sys_user_process_permission
(process_sid, user_sid, can_add, can_update, can_delete, can_view)
select sId,@userId,1,1,1,1 from process;
COMMIT;
END;$
开发工具
线程池
在 spring-context.xml 制作了线程池的配置参数,首次制作用于往来单位中使用多线程上传客户数据到云服务器(控制器 ContactcompanyController)
RestTemlate
在目录 config 下创建了类 RestTemplateConfig 用于发送 http 请求,在 spring-context.xml 注册了该类,本功能首次用于招商织染的项目,用于向中间项目发送 post 请求,向自动称料系统写入染色配料单单据。
<bean class="account.config.RestTemplateConfig"/>
自动配置类
在文件 spring-context.xml 中制作 bean,类似下面代码
<bean class="account.config.StartupListener"/>
缸号规则
修改缸号规则每月重置自增数字(自增数字为4位),在表 config_billcode 中修改:
- 单据编号_年份位数 = 2
- 单据编号_计数位数 = 4
- 单据编号_计数清零 = M
按年重置自增数字(自增数字为6位)
- 单据编号_年份位数 = 2
- 单据编号_计数位数 = 6
- 单据编号_计数清零 = Y
全局异常
项目中已经使用该特性,使用 src\main\java\Exc 下是自定义的系统异常
热加载系统参数
2022年7月20日 10:35:59 记录本功能 首次在白玉兰项目中使用,account.config.StartupListener 通过实现 ApplicationListener 达到启动项目加载后台配置参数的目的。多层结构实现该功能,从内到外:表 g_config_oneint,g_config_onefloat 等包装到 SystemParams 中(此时本类中只有 g_config_oneint 的属性,之后再追加其他DB表对应的属性),然后通过工具类 SystemParamsUtils 刷新配置数据对象。预计在 account.controller.config 包下制作 SystemParamsController 用于前端请求刷新系统参数(后台更改参数后执行请求实现热加载效果) - 还未制作该功能
新客户与新项目
新项目
在本地电脑上拉取重新拉取项目源码后在 IDEA 中做初始化的步骤:
在
File -> Setting中设置encoding = utf-8File -> Project Structure中的Modules下设置项目的resource包为Resources类型关联
tomcat服务器
新客户需要调整的配置
config_title 中保存客户订单主表中为发货设置的抬头名称
reportlets 中保存了白坯、成品打印的标题头。发货单是上面1拼接本表的 id = 2 构成发货单标题头
erp 染厂名称 g_printingdyeingname - 关联到云端和软件 header title
ContactcompanyController.java # insert 方法中上传数据的逻辑要注释掉,否则影响新增客户的执行速度
清除两个上传记录表:upload_process,upload_record
使用下面
sql创建仅查看的用户# 为系统新增仅查看无权限操作的用户 START TRANSACTION; set foreign_key_checks = 0; set @roleId = 201; set @roleName = '仅查看角色'; set @roleRemark = '可查看所有报表,没有操作权限'; set @userId = 2001; set @userName = '仅查看用户'; set @userPWD = '123456'; # 1. 新增只查看无权限操作的角色 insert into role (sId,name,remark) values (@roleId,@roleName,@roleRemark); # 2. 赋予新角色所有查看权限,后面的大于0表示菜单树的叶子节点(有实际页面的菜单项) insert into roleauthority(roleSid,entitySid,`view`) select 201,a.id,1 from sys_main_menu a where ifnull(a.parentId,0)>0; # 3. 新增用户 insert into user (sId,name,nickName,password) values (@userId,@userName,@userName,@userPWD); # 4. 新用户绑定角色 insert into sys_role_user(userSid,roleSid) values (@userId,@roleId); set foreign_key_checks = 1; COMMIT;微信 “日产量表” 中只显示在:基础资料 > 工序 中配置了允许显示在微信上
注意配置染厂云数据库中 mill 中关联线下服务器查看能源系统的参数
表格列宽记忆
表 deploy 记录每个对象的列宽数据
菜单项
菜单页面 src/main/webapp/WEB-INF/web/LoginPage/menu.jsp,硬编码方式设置了每个页面对于 ModelAndView 的请求。源码中硬编码的菜单编号是account.authority.MenuId.java。模型和视图控制器是JSP页面路由注册在 account.controller.system.ModelAndViewController 一般请求URI 和相关的方法同名,在其后追加 .do
用户与权限
匿名权限API
D:\source\java\pademis\tianzhiran\pademis_ssm\src\main\resources\Spring\spring-Shiro.xml 中找到 shiro 自动配置 bean id="shiroFilter" 其中填写需要的API即可
创建仅查看的用户和角色
创建一个新角色,只有查看所有报表和单据的权限,不可做 CUD 操作
# 为系统新增仅查看无权限操作的用户
START TRANSACTION;
set foreign_key_checks = 0;
set @roleId = 201;
set @roleName = '仅查看角色';
set @roleRemark = '可查看所有报表,没有操作权限';
set @userId = 2001;
set @userName = '仅查看用户';
set @userPWD = '123456';
# 1. 新增只查看无权限操作的角色
insert into role (sId,name,remark) values (@roleId,@roleName,@roleRemark);
# 2. 赋予新角色所有查看权限
insert into roleauthority(roleSid,entitySid,`view`)
select 201,a.id,1 from sys_main_menu a where ifnull(a.parentId,0)>0;
# 3. 新增用户
insert into user (sId,name,nickName,password) values (2001,@userName,@userName,@userPWD);
# 4. 新用户绑定角色
insert into sys_role_user(userSid,roleSid) values (@userId,@roleId);
set foreign_key_checks = 1;
COMMIT;
工具栏靠右显示
见白玉兰项目的报表“客户订单序时表”,SC_ProcessBill.jsp,搜索关键字“包含改色”。代码如下:
<div class="pull-right">
<div style="height: 50%;">
<span style="padding: 1px;width: 12px;height:12px;display: inline-block; background-color: blue;"> </span>
<span>包含改色</span>
</div>
</div>
万能查询接口
- 简单查询SQL 后台API - tools/queryForList/{sql} - get 请求 后面花括号代表SQL语句
- 调用存储过程 后台API - tools/queryForListCallProc - post 请求 传入参数是数组:[usp_xxx,12,张三] 第一个参数表示存储过程名称,后面可变参数 - 不限数量
删除“系统”产量
# 删除指定日期的系统的产量数据
DELETE
FROM g_cjflowbilldetailpeople
WHERE B_ID IN (SELECT a.B_ItemID
FROM g_cjflowbilldetailprocess a
WHERE B_Peoples LIKE '%系统%' AND DATE(B_Date) = DATE('2021-04-12'));
DELETE
FROM g_cjflowbilldetailprocess
WHERE B_Peoples LIKE '%系统%' AND DATE(B_Date) = DATE('2021-04-12');
自定义SQL
执行自定查询SQL的工具类
package account.util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* 动态查询
* @author chanchaw
* @create 2022-10-17 13:56
*/
@Service
public class DynamicDBUtils {
@Autowired
private DataSource dataSource;
public List<Map<String,Object>> queryForListCallProc(List<String> procAndParams){
String sqlString = callProc2SQLString(procAndParams);
return queryForList(sqlString);
}
public List<Map<String,Object>> queryForList(String sql){
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
List<Map<String,Object>> list = jdbcTemplate.queryForList(sql,new HashMap<>());
return list;
}
public String callProc2SQLString(List<String> callProc){
if( callProc == null || callProc.size()<=0 ) return "";
String sqlString = "call " + callProc.get(0) + "(";
String comma = ",";
for (int i = 1; i < callProc.size(); i++) {
if(i == 1)
comma ="";
else
comma =",";
String currentItem = Optional.ofNullable(callProc.get(i)).orElse("");
if(currentItem.length()<=0)
sqlString = sqlString + comma + "''";
else
sqlString = sqlString + comma + "'" + callProc.get(i) + "'";
}
sqlString += ")";
return sqlString;
}
public int updateSql(String sql){
JdbcTemplate jdbcTemplate1 = new JdbcTemplate(dataSource);
return jdbcTemplate1.update(sql);
}
}
并制作暴露的API
package account.controller.system;
import account.enums.Response;
import account.enums.ReturnMessage;
import account.entity.ResponseResult;
import account.util.DynamicDBUtils;
import account.util.MigrateCash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @ClassName:ToolsController
* @Description:开发人员使用的工具
* @Author:chanchaw
* @Date:2020-01-18 9:50
* @Version:1.0
**/
@RestController
@RequestMapping("/tools")
public class ToolsController {
@Autowired
private MigrateCash migrateCash;
@Autowired
private DynamicDBUtils dynamicDBUtils;
@RequestMapping(value = "/migrate", method = RequestMethod.GET)
public ResponseResult<String> migrateCash() throws Exception {
String ret = migrateCash.migrate();
return new ResponseResult<String>(Response.OK.getId(), ReturnMessage.SUCCESS.getMsg(), ret);
}
@RequestMapping(value = "/updateBillCode", method = RequestMethod.GET)
public ResponseResult<String> updateBillCode() throws Exception {
String ret = migrateCash.updateBillCode();
return new ResponseResult<String>(Response.OK.getId(), ReturnMessage.SUCCESS.getMsg(), ret);
}
/**
* @Description :判断参数日期是否为服务器日期
* [date] 参数日期
* @Return : account.entity.ResponseResult<java.lang.Boolean>
* @Author : 张柯
* @Date : 2020/11/2 16:42
*/
@RequestMapping(value = "/isServerTime/{date}", method = RequestMethod.GET)
public ResponseResult<Boolean> isServerTime(@PathVariable("date") @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = new Calendar.Builder().setInstant(date).build();
boolean isSameYear = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR);
boolean isSameMonth = cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);
boolean isSameDate = cal1.get(Calendar.DATE) == cal2.get(Calendar.DATE);
return new ResponseResult<>(Response.OK.getId(), Response.OK.getName(), isSameYear && isSameMonth && isSameDate);
}
// 传入查询 sql 返回查询结果
@RequestMapping(value = "/queryForList/{sql}", method = RequestMethod.GET)
public ResponseResult<List<Map<String,Object>>> queryForList(@PathVariable String sql) {
List<Map<String,Object>> ret = dynamicDBUtils.queryForList(sql);
return new ResponseResult<List<Map<String,Object>>>(Response.OK.getId(), ReturnMessage.SUCCESS.getMsg(), ret);
}
// 传入字符串数组调用存储过程进行查询:[usp_xxx,12,张三]
// 字符串集合的第一个参数作为存储过程名称,后面的参数都作为存储过程的参数
@RequestMapping(value = "/queryForListCallProc", method = RequestMethod.POST)
public ResponseResult<List<Map<String,Object>>> queryForListCallProc(@RequestBody List<String> procAndParams) {
List<Map<String,Object>> ret = dynamicDBUtils.queryForListCallProc(procAndParams);
return new ResponseResult<List<Map<String,Object>>>(Response.OK.getId(), ReturnMessage.SUCCESS.getMsg(), ret);
}
}
初次整理在 2023年10月6日 08:09:12 阳丰项目
删除作废缸单
2023年9月23日 15:14:23 小李整理,删除被作废的指定主键之后的缸单
select * from plan where `status`<>1 and id>=56355
-- 计划对应的工序表
select * from craftdetail_plan
-- 计划对应领料车数
select * from detailbill_plan limit 11
select * from craftdetail_plan
where vatNum in (select vatNum from plan where `status`<>1 and id>=56355)
select * from detailbill_plan
where vatNO in (select vatNum from plan where `status`<>1 and id>=56355)
-- 计划领料主表
select * from bpbillmain
where vatNO in (select vatNum from plan where `status`<>1 and id>=56355)
-- 计划领料明细
select * from bpbilldetail
where billCode in
(
select billCode from bpbillmain
where vatNO in (select vatNum from plan where `status`<>1 and id>=56355)
)
-- 核销
select * from bpbilldetail
where vid in (select id from plan where `status`<>1 and id>=56355)
-- 删除,确定要开始删除的主键后可直接执行下面的删除逻辑,上面的查询是求严谨的情况下查看下
-- 下面删除逻辑中没有删除的数据:核销领料、打卷、发货
-- 计划对应的工序表
delete from craftdetail_plan
where vatNum in (select vatNum from plan where `status`<>1 and id>=56355);
-- 计划对应领料车数
delete from detailbill_plan
where vatNO in (select vatNum from plan where `status`<>1 and id>=56355);
-- 计划领料明细
delete from bpbilldetail
where billCode in
(
select billCode from bpbillmain
where vatNO in (select vatNum from plan where `status`<>1 and id>=56355)
);
-- 计划领料主表
delete from bpbillmain
where vatNO in (select vatNum from plan where `status`<>1 and id>=56355);
delete from plan where `status`<>1 and id>=56355;
查看客户指定日期之后的刷卡数据
调用方法 call usp_getClientRecentYield('硕博','2022-10-17'); 淡淡的
# MYSQL
DROP PROCEDURE IF EXISTS `usp_getClientRecentYield`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_getClientRecentYield`(IN clientName VARCHAR(100),IN startDate DATE)
BEGIN
select *
from g_cjflowbilldetailprocess as a
where
DATE(a.B_Date)>= startDate
and a.B_ID in (
select vatNum from plan where clientId = (
select sId from contactcompany where name = clientName
)
);
END;$
删除缸单即关联的数据
下面是仅仅删除缸单的附属数据,不删除缸单数据
create definer = root@`%` procedure usp_clearPlanData(IN vatNos varchar(1000))
BEGIN
# 删除指定缸号的所有相关数据:计划单、批量模式下的明细数据、工序、车数数据、计划领料数据
START TRANSACTION;
drop temporary table if exists tmpVatNos;
CREATE TEMPORARY TABLE tmpVatNos(# 指定缸号的所有兄弟缸号
vatNo VARCHAR(50)
);
drop temporary table if exists tmpBpBillCode;
CREATE TEMPORARY TABLE tmpBpBillCode(# 指定缸号的所有兄弟缸号
billCode VARCHAR(50)
);
INSERT INTO tmpVatNos(vatNo)
SELECT substring_index(substring_index(vatNos,',',a.help_topic_id+1),',',-1) AS vatNo
FROM mysql.help_topic a
WHERE a.help_topic_id < (length(vatNos) - length(replace(vatNos,',',''))+1);
# 1. 删除批量模式下的明细数据plan_dtl,由于主表plan_main没有关联所以无法删除
DELETE FROM plan_dtl WHERE vat_num IN (select vatNo FROM tmpVatNos);
# 2. 删除计划单工序
DELETE FROM craftdetail_plan WHERE vatNum IN(select vatNo FROM tmpVatNos);
# 3. 删除车数数据
DELETE from detailbill_plan where vatNO IN (select vatNo FROM tmpVatNos) ;
# 4. 删除白坯计划领料数据
INSERT into tmpBpBillCode(billCode)
select billCode from bpbillmain WHERE vatNO IN (select vatNo FROM tmpVatNos);
DELETE FROM bpbilldetail WHERE billCode IN (SELECT billCode FROM tmpBpBillCode WHERE 1=1);
DELETE FROM bpbillmain WHERE billCode IN (SELECT billCode FROM tmpBpBillCode WHERE 1=1);
COMMIT;
END;
下面删除计划单以及其相关的所有数据(包括批量生成计划单时的 plan_main 数据)
create definer = root@`%` procedure usp_clearPlanData8OrderDtlId(IN orderDetailId int)
BEGIN
set foreign_key_checks = 0;
# 删除指定缸号的所有相关数据:计划单、批量模式下的明细数据、工序、车数数据、计划领料数据
START TRANSACTION;
drop temporary table if exists tmpVatNos;
CREATE TEMPORARY TABLE tmpVatNos(# 指定缸号的所有兄弟缸号
vatNo VARCHAR(50)
);
drop temporary table if exists tmpBpBillCode;
CREATE TEMPORARY TABLE tmpBpBillCode(# 指定缸号的所有兄弟缸号
billCode VARCHAR(50)
);
INSERT INTO tmpVatNos(vatNo)
SELECT vatNum FROM plan WHERE fid = orderDetailId;
# 1. 删除批量模式下的明细数据plan_dtl,由于主表plan_main没有关联所以无法删除
DELETE FROM plan_dtl WHERE vat_num IN (select vatNo FROM tmpVatNos);
# 2. 删除计划单工序
DELETE FROM craftdetail_plan WHERE vatNum IN(select vatNo FROM tmpVatNos);
# 3. 删除车数数据
DELETE from detailbill_plan where vatNO IN (select vatNo FROM tmpVatNos) ;
# 4. 删除白坯计划领料数据
INSERT into tmpBpBillCode(billCode)
select billCode from bpbillmain WHERE vatNO IN (select vatNo FROM tmpVatNos);
DELETE FROM bpbilldetail WHERE billCode IN (SELECT billCode FROM tmpBpBillCode WHERE 1=1);
DELETE FROM bpbillmain WHERE billCode IN (SELECT billCode FROM tmpBpBillCode WHERE 1=1);
# 5. 删除计划单 - 缸单
DELETE FROM plan WHERE fid = orderDetailId;
# 6. 删除 plan_main
DELETE FROM plan_main WHERE parent_id = orderDetailId;
COMMIT;
set foreign_key_checks = 1;
END;
为所有客户默认推送3个工序
# 给所有客户指定3个工序:翻布、染色、成品定型
DELIMITER $$
DELETE FROM process_mapping WHERE 1=1;
INSERT INTO process_mapping
(client_id, client_name, process_name)
SELECT a.sId,a.name,b.name AS process_name
FROM contactcompany a
CROSS JOIN process b
WHERE b.name IN ('翻布','染色','成品定型');$$
DELIMITER ;
上传服务相关
清空ERP本地数据库中上传相关的两个表的数据,同时设定从某行刷卡数据开始上传
# 清空测试数据
DELETE FROM upload_process WHERE 1=1;
DELETE FROM upload_record WHERE 1=1;
INSERT INTO upload_record (upload_table, table_iid) VALUES ('g_cjflowbilldetailprocess','34803');
清空云端数据库中和刷卡相关的两个表的数据
# 删除测试数据
delete from client_pushlist;
delete from client_pushlist_detail;
根据缸号查询获取客户所有允许上传的工序
SELECT b.* FROM plan a
LEFT JOIN process_mapping b ON a.clientId=b.client_id
WHERE a.vatNum='R10060549';
为指定客户设置所有工序都可上传云端
# 为指定客户设置所有工序都可上传
# 先删除该客户的所有设置,再补全
DELIMITER $$
SET @clentId = '1373';
SET @clientName = '武良';
DELETE FROM process_mapping WHERE client_id = @clentId;
INSERT INTO process_mapping(client_id, client_name, process_name)
SELECT @clentId,@clientName,name
FROM process;$$
DELIMITER ;
刷新染料单价
http://localhost:8080/PADEMIS/goodsdyebill/refreshPriceAll
删除指定缸号的所有兄弟缸号
# =============================================
# 传入参数:缸号
# 目标:删除该缸号的所有兄弟缸号关联的白坯领料记录、白坯计划扣库单据主表+明细表数据
# 删除该缸号的所有兄弟缸号包括自己
DELIMITER $$
SET @vatNum='R10040095';
SET @fid = 0;# 订单明细表主键
drop temporary table if exists vatNums;
drop temporary table if exists billCodes;
CREATE TEMPORARY TABLE vatNums(# 指定缸号的所有兄弟缸号
vatNum VARCHAR(50)
);
CREATE TEMPORARY TABLE billCodes(# 计划领料的所有单据编号
billCode VARCHAR(50)
);
# 初始化所有待使用变量
SELECT @fid:=fid FROM plan WHERE vatNum=@vatNum;# 赋值订单明细表主键
INSERT INTO vatNums # 赋值所有缸号
SELECT vatNum FROM plan WHERE fid=@fid;
INSERT INTO billCodes # 赋值所有计划扣库的单据编号
SELECT a.billCode
FROM bpbillmain a
LEFT JOIN bpbilldetail b ON a.billCode = b.billCode
WHERE b.billtypeId=3 # 生产领料单
AND a.vatNO IN (
SELECT vatNum FROM vatNums
);
# 查询获取指定缸号的所有兄弟缸号
# SELECT * FROM plan WHERE fid=(
# SELECT fid
# FROM plan WHERE vatNum=@vatNum);
START TRANSACTION;
# A. 删除缸单右下角领料记录
DELETE FROM detailbill_plan WHERE vatNO IN (
SELECT vatNum FROM vatNums
);
DELETE FROM craftdetail_plan WHERE vatNum IN (
SELECT vatNum FROM vatNums
);
# B. 删除这些缸号对应的计划扣库单据
# 1. 先删除明细表数据
DELETE FROM bpbilldetail WHERE billCode IN (
SELECT billCode FROM billCodes
);
# 2. 再删除主表数据
DELETE FROM bpbillmain WHERE billCode IN
(
SELECT billCode FROM billCodes
);
# C. 删除指定缸号的所有兄弟缸号
DELETE FROM plan WHERE fid = @fid;
COMMIT;$$
# =============================================
查询获取发货单明细数据
# MYSQL
DROP PROCEDURE IF EXISTS `usp_getFHDDetail`;
delimiter $
# 下面的 `root`@`%`表示允许任意机器上通过用户root使用本存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `usp_getFHDDetail`(IN ip_billCode VARCHAR(50))
BEGIN
SELECT a.id AS id_cpbill,a.billCode,a.date AS date_cpbill,a.clientId,
c.id AS id_plan,c.orderNo,c.colorClothId AS goodsCategory,c.colorClothName AS goodsName,
c.cp_specification,c.colorNoId,c.color,c.paperTube,c.packageWeight,c.`empty`,c.emptyHidden,c.packageType,
b.B_GJ,b.B_MS,b.B_PH2
FROM cpbillmain a
LEFT JOIN g_jrkbill b
ON a.id = b.B_FPDID
LEFT JOIN plan c
ON b.B_ID = c.id
WHERE a.billCode=ip_billCode;
END;$
根据订单号查询库存
drop temporary table if exists tmpTable_billCode;
drop temporary table if exists tmpTable_vatId;
SET @orderNo = 'FC-02';
CREATE TEMPORARY TABLE tmpTable_billCode(
billCode VARCHAR(100)
);
CREATE TEMPORARY TABLE tmpTable_vatId(
iid int
);
INSERT INTO tmpTable_billCode
SELECT billCode FROM billordermain WHERE orderNo=@orderNo;
INSERT INTO tmpTable_vatId
SELECT sId FROM billorderdetail WHERE billCode IN (SELECT billCode FROM tmpTable_billCode);
SELECT * FROM g_jrkbill WHERE B_ID IN (SELECT iid FROM tmpTable_vatId)
AND B_FPDID IS NULL
;
设置客户上传所有工序
# 设置某客户上传所有工序:先删除该客户的所有工序,再补充全部工序
SELECT * FROM contactcompany WHERE name LIKE '徐静%';
DELIMITER $$
SET @clientId = '1243';
SET @clientName = '徐静亚';
DELETE FROM process_mapping WHERE client_id=@clientId;
INSERT INTO process_mapping(client_id, client_name, process_name)
SELECT @clientId,@clientName,name FROM process;$$
DELIMITER ;
根据工序产量主键查询微信端推送逻辑
# 根据工序产量表主键查询获得当前缸单的进度和颜色维度的进度
DELIMITER $$
SET @yieldPK = 183002;
SET @orderIId = 123;
SELECT p.fid INTO @orderIId FROM g_cjflowbilldetailprocess a
LEFT JOIN plan p ON a.B_ID = p.vatNum
WHERE a.B_ItemID=@yieldPK;
SELECT a.B_ItemID,a.B_ID AS vat_num,
a.B_Date,p.sId AS process_sid,p.name AS process_name,
# @rowIndex:=@rowIndex+1 AS row_index,
CASE WHEN p.name = a.B_ProcessName THEN '✔' ELSE '' END AS yield_process,
CASE WHEN p.name = c.process_name THEN '✔' ELSE '' END AS gd_process,
CASE WHEN p.name = d.process_name THEN '✔' ELSE '' END AS color_process,
c.order_iid
FROM g_cjflowbilldetailprocess a
LEFT JOIN craftdetail_plan b ON a.B_ID=b.vatNum
LEFT JOIN process p ON b.processId = p.sId
# LEFT JOIN (SELECT @rowIndex:=0) ri ON 1=1
LEFT JOIN upload_process c ON a.B_ID=c.vat_num
LEFT JOIN (
SELECT dd.* FROM
(
SELECT max(iid) AS iid
FROM
(
SELECT order_iid,max(process_index) AS process_index
FROM upload_process
WHERE order_iid=@orderIId
GROUP BY order_iid
) aa
LEFT JOIN upload_process bb
ON aa.order_iid = bb.order_iid
AND aa.process_index = bb.process_index
) cc
LEFT JOIN upload_process dd
ON cc.iid=dd.iid
) d ON p.name = d.process_name
WHERE a.B_ItemID=@yieldPK
ORDER BY b.sId asc;
DELIMITER ;
给用户批量设置工序权限
# 下面语句的1002是登录系统的账号的工号
UPDATE sys_user_process_permission SET can_add=1,can_update=1,can_delete=1,can_view=1 WHERE user_sid=1002;
easy grid 记忆表格列配置
在表格事件 onResizeColumn 下黏贴下面代码
if (w < 30) {
if (f == 'element' || f == 'kilo' || f == 'colorClothName') {
$.messager.show({title: '提示', msg: '无法隐藏该列,因为该列为必输项'});
return;
}
$(this).datagrid('hideColumn', f);
$.post("deploy/update.do", {menuId: MENUID, hidden: true, width: w, fieldname: f}, function (data) {
if (data.state == 200) {
sessionStorage.removeItem(AUTO_PICKING_BP_STORAGE_COLUMN_CONFIG);
}
}, "json");
} else {
$.post("deploy/update.do", {menuId: MENUID, hidden: false, width: w, fieldname: f}, function (data) {
if (data.state == 200) {
sessionStorage.removeItem(AUTO_PICKING_BP_STORAGE_COLUMN_CONFIG);
}
}, "json");
}
在页面代码顶层黏贴下面代码,注意全局变量 MENUID 和 AUTO_PICKING_BP_STORAGE_COLUMN_CONFIG
getcolumnsConfig();
var that = "#bp_out";
var opts = $(that).datagrid('getColumnFields');
$.ajax({
url: "deploy/query.do",
data: {menuId: MENUID, name: opts},
dataType: "json",
type: "post",
traditional: true,
success: function (data) {
if (data) {
for (var i = 0; i < opts.length; i++) {
var col = $(that).datagrid('getColumnOption', opts[i]);
col.width = parseInt(data[opts[i]].width);
if (data[opts[i]].hidden) {
$(that).datagrid('hideColumn', opts[i]);
}
$(that).datagrid();
}
}
}
});
// 获取列配置
function getcolumnsConfig() {
let prefix = AUTO_PICKING_BP_STORAGE_COLUMN_CONFIG;
var that = "#bp_out";
var opts = $(that).edatagrid('getColumnFields');
if (sessionStorage.getItem(prefix) != undefined) {
let data = JSON.parse(sessionStorage.getItem(prefix));
ex(that, opts, data);
return;
}
function ex(ele, opts, data) {
for (let i of opts) {
let col = $(ele).datagrid('getColumnOption', i);
if (!data[i]) continue;
if (data[i]['width'] != undefined && data[i]['width'] != null)
col.width = data[i]['width'];
if (data[i]['hidden']) {
$(ele).datagrid('hideColumn', i);
} else {
$(ele).datagrid('showColumn', i);
}
}
$(ele).datagrid();
}
$.ajax({
url: "deploy/query.do",
data: {menuId: MENUID, name: opts},
dataType: "json",
async: false,
type: "post",
traditional: true,
success: function (data) {
if (data) {
sessionStorage.setItem(prefix, JSON.stringify(data));
ex(that, opts, data);
}
}
});
}
打开计划单
文件 planUtils.js 中的函数 openPlanNewTab 执行后打开新的标签页显示计划单
通知与提醒
锁定输入
// 在发送异步请求前调用下面代码,锁定用户输入
$.messager.progress({title: '正在提交...', interval: 300});
// 异步请求的 complete 内调用下面方法,释放 UI 的锁定
$.messager.progress('close');
右下角弹出提示
$.messager.show({title: '提示', msg: '没有权限!'});
清除数据 - 2021年12月4日 08:22:19
来自小张给的脚本
清除所有单据数据
use pademisaccount;
set foreign_key_checks = 0;
# 删除白坯数据
truncate TABLE bpbilldetail;
truncate TABLE bpbillmain;
# 删除订单数据
truncate TABLE billorderdetail;
truncate TABLE billordermain;
truncate TABLE billordercondition;
TRUNCATE TABLE craftdetail_order;
TRUNCATE TABLE craftcolordetail;
# 删除订单明细对应的工序
truncate TABLE craftdetail_order;
# 删除计划单数据
truncate TABLE detailbill_plan;
truncate TABLE craftdetail_plan;
truncate TABLE plan;
truncate TABLE plancondition;
truncate TABLE plan_dtl;
# 删除成品数据
truncate TABLE cpbill_audited;
truncate TABLE cpbilldetail;
truncate TABLE cpbillmain;
# 删除打卷数据
truncate TABLE g_jrkbill;
# 删除产量数据
truncate TABLE g_cjflowbilldetailpeople;
truncate TABLE g_cjflowbilldetailprocess;
truncate TABLE g_jrkbilldraft;
# 删除废布
truncate TABLE wastecloth;
# 配方
truncate TABLE craftcolor;
truncate TABLE craftcolor_dtl;
truncate TABLE craftprintlog;
truncate TABLE craftprintlog_dtl;
# 五金
truncate TABLE metalbilldetail;
truncate TABLE metalbillmain;
# 处方
truncate TABLE registration_of_receipts;
truncate TABLE registration_of_makereceipts;
truncate TABLE process_mapping;
truncate TABLE specificationtype;
# 清除本地上传记录
TRUNCATE TABLE upload_process;
TRUNCATE TABLE upload_record;
# 2024年4月2日 13:37:31 补充清除数据
TRUNCATE TABLE debug_data;
TRUNCATE TABLE g_printlogdetail;
TRUNCATE TABLE bpbilldetail_msg;
TRUNCATE TABLE g_systemlogin;
TRUNCATE TABLE plan_daily_record;
TRUNCATE TABLE g_printlogfc;
TRUNCATE TABLE g_printlogmain;
TRUNCATE TABLE g_cjflowbilldetailprocess_daily_record;
TRUNCATE TABLE clmx;
TRUNCATE TABLE g_cjlog_saveclpeople;
TRUNCATE TABLE plan_main;
TRUNCATE TABLE craftcolormain;
TRUNCATE TABLE colorno;
TRUNCATE TABLE g_jrkbill_daily_record;
TRUNCATE TABLE g_cjbill_n;
TRUNCATE TABLE g_billdetail01;
TRUNCATE TABLE cash_detail;
TRUNCATE TABLE cpbill_stevedore;
TRUNCATE TABLE cl;
TRUNCATE TABLE bpbill_stevedore;
TRUNCATE TABLE g_cjlogpeopleset;
TRUNCATE TABLE cache_color;
TRUNCATE TABLE g_bill01;
TRUNCATE TABLE cash_main;
TRUNCATE TABLE color_register;
TRUNCATE TABLE cpbill_dtl_daily_record;
TRUNCATE TABLE craftcolordetail_del;
TRUNCATE TABLE g_cartextile;
TRUNCATE TABLE g_cjchzz;
TRUNCATE TABLE bpbilldetail_zfdate;
TRUNCATE TABLE g_cjprocesscraftd;
TRUNCATE TABLE billordermain;
TRUNCATE TABLE g_cjpeoplecontinue;
TRUNCATE TABLE g_jrkbill_rz;
TRUNCATE TABLE g_craftlist;
TRUNCATE TABLE contactcompany_finance;
TRUNCATE TABLE cp_detect;
TRUNCATE TABLE g_contactcompany;
TRUNCATE TABLE rtr_bp;
TRUNCATE TABLE rtr_cp;
TRUNCATE TABLE g_uploadprocess;
TRUNCATE TABLE g_cjprocessbatch;
TRUNCATE TABLE g_cjprocessbatchbill;
TRUNCATE TABLE g_goodsdye;
TRUNCATE TABLE everydaydetailtobudget;
TRUNCATE TABLE g_hostlogin;
TRUNCATE TABLE g_sehao;
TRUNCATE TABLE g_cjprocessconvert;
TRUNCATE TABLE pinming;
TRUNCATE TABLE g_cjclashsameprocessex;
TRUNCATE TABLE color;
TRUNCATE TABLE colortype;
set foreign_key_checks = 1;
清除所有基础数据
use pademisaccount;
set foreign_key_checks = 0;
# 清空打卷人员
truncate g_djpeople;
# 基础资料清除
truncate contactcompany;
truncate raw;
# 清除工序
truncate process;
# 清除工艺
truncate craftdetail;
# 部门
truncate department;
insert into department (sId, name) values (9999, '全部');
truncate employee;
truncate deploy;
truncate sys_wechatuserauth;
truncate sys_role_user;
truncate user;
# 插入超级管理员用户
insert into user (sId, name, password) values (1000, '超级管理员', 'xdf123456');
# 设置=超级用户权限
insert into sys_role_user (userSid, roleSid, remark) values (1000, 100, '自动添加超级管理员权限');
# 清空班组
truncate class;
# 清空班组工序与映射
truncate class_pro;
# 清空色布
truncate colorclothcategory;
# 清空单价套用
truncate editprice;
truncate editpricedetail;
# 清除工艺
truncate craftmain;
insert into craftmain (sid, name) values (1,'染色'),(2,'圆网'),(3,'平网');
# 清空白坯
truncate greyfabric;
truncate greyfabrictype;
set foreign_key_checks = 1;
2023年10月27日 常州汉丰
2023年10月27日 16:45:28 常州汉丰清除基础资料的脚本
use pademisaccount;
set foreign_key_checks = 0;
# 清空打卷人员
truncate g_djpeople;
# 基础资料清除
truncate contactcompany;
truncate raw;
# 部门
truncate employee;
# 清空班组
truncate class;
# 清空班组工序与映射
truncate class_pro;
# 清空色布
truncate colorclothcategory;
# 清空单价套用
truncate editprice;
truncate editpricedetail;
# 清空白坯
truncate greyfabric;
truncate greyfabrictype;
# 清除染料仓库单据数据
TRUNCATE TABLE goodsdyebillmain;
TRUNCATE TABLE goodsdyebilldetail;
# 铭凯威新增表
TRUNCATE TABLE bill_order_grey_cloth; # 客户订单中的坯布采购计划
TRUNCATE TABLE billorderdetail_img; # 客户订单明细样布图片
set foreign_key_checks = 1;
