init commit

This commit is contained in:
2025-07-03 10:34:04 +08:00
commit 95877f3592
6545 changed files with 889190 additions and 0 deletions

0
.idea/.gitignore generated vendored Normal file
View File

8
.idea/compiler.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel>
<module name="cmeim" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>

View File

@ -0,0 +1,36 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
<option name="TOP_LEVEL_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="INNER_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="METHOD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
</value>
</option>
<option name="FIELD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="IGNORE_DEPRECATED" value="false" />
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
<option name="myAdditionalJavadocTags" value="date" />
</inspection_tool>
</profile>
</component>

25
.idea/jarRepositories.xml generated Normal file
View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="cmeim-maven" />
<option name="name" value="cmeim-alimaven" />
<option name="url" value="http://dev.cme-im.com/nexus/repository/maven-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://nexus.cme-im.com:55443/nexus/repository/maven-public/" />
</remote-repository>
</component>
</project>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.boot:spring-boot:2.3.7.RELEASE">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/boot/spring-boot/2.3.7.RELEASE/spring-boot-2.3.7.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/boot/spring-boot/2.3.7.RELEASE/spring-boot-2.3.7.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/boot/spring-boot/2.3.7.RELEASE/spring-boot-2.3.7.RELEASE-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.cloud:spring-cloud-commons:2.2.6.RELEASE">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/cloud/spring-cloud-commons/2.2.6.RELEASE/spring-cloud-commons-2.2.6.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/cloud/spring-cloud-commons/2.2.6.RELEASE/spring-cloud-commons-2.2.6.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/cloud/spring-cloud-commons/2.2.6.RELEASE/spring-cloud-commons-2.2.6.RELEASE-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.security:spring-security-crypto:5.3.6.RELEASE">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/security/spring-security-crypto/5.3.6.RELEASE/spring-security-crypto-5.3.6.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/security/spring-security-crypto/5.3.6.RELEASE/spring-security-crypto-5.3.6.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/security/spring-security-crypto/5.3.6.RELEASE/spring-security-crypto-5.3.6.RELEASE-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-aop:5.2.12.RELEASE">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-aop/5.2.12.RELEASE/spring-aop-5.2.12.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-aop/5.2.12.RELEASE/spring-aop-5.2.12.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-aop/5.2.12.RELEASE/spring-aop-5.2.12.RELEASE-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-beans:5.2.12.RELEASE">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-beans/5.2.12.RELEASE/spring-beans-5.2.12.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-beans/5.2.12.RELEASE/spring-beans-5.2.12.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-beans/5.2.12.RELEASE/spring-beans-5.2.12.RELEASE-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-context:5.2.12.RELEASE">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-context/5.2.12.RELEASE/spring-context-5.2.12.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-context/5.2.12.RELEASE/spring-context-5.2.12.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-context/5.2.12.RELEASE/spring-context-5.2.12.RELEASE-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-core:5.2.12.RELEASE">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-core/5.2.12.RELEASE/spring-core-5.2.12.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-core/5.2.12.RELEASE/spring-core-5.2.12.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-core/5.2.12.RELEASE/spring-core-5.2.12.RELEASE-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-expression:5.2.12.RELEASE">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-expression/5.2.12.RELEASE/spring-expression-5.2.12.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-expression/5.2.12.RELEASE/spring-expression-5.2.12.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-expression/5.2.12.RELEASE/spring-expression-5.2.12.RELEASE-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-jcl:5.2.12.RELEASE">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-jcl/5.2.12.RELEASE/spring-jcl-5.2.12.RELEASE.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-jcl/5.2.12.RELEASE/spring-jcl-5.2.12.RELEASE-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../server/maven/repository/org/springframework/spring-jcl/5.2.12.RELEASE/spring-jcl-5.2.12.RELEASE-sources.jar!/" />
</SOURCES>
</library>
</component>

11
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/cmeim.iml" filepath="$PROJECT_DIR$/cmeim.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="svn" />
</component>
</project>

59
.idea/workspace.xml generated Normal file
View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="2c999ccd-72c6-4053-87e5-c06267607d77" name="Default Changelist" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="MavenImportPreferences">
<option name="generalSettings">
<MavenGeneralSettings>
<option name="alwaysUpdateSnapshots" value="true" />
<option name="localRepository" value="D:\server\maven\repository" />
<option name="mavenHome" value="C:/Program Files/apache-maven-3.5.3" />
<option name="userSettingsFile" value="C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.3\plugins\maven\lib\maven3\conf\settings.xml" />
</MavenGeneralSettings>
</option>
</component>
<component name="ProjectId" id="2zLK3XrqWhEx6oYyRXUNvnI6t9C" />
<component name="ProjectViewState">
<option name="abbreviatePackageNames" value="true" />
<option name="showLibraryContents" value="true" />
<option name="showMembers" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="aspect.path.notification.shown" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="project.structure.last.edited" value="Project" />
<property name="project.structure.proportion" value="0.0" />
<property name="project.structure.side.proportion" value="0.0" />
<property name="settings.editor.selected.configurable" value="MavenSettings" />
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="SvnConfiguration" cleanupOnStartRun="true">
<configuration>C:\Users\86484\AppData\Roaming\Subversion</configuration>
<supportedVersion>125</supportedVersion>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="2c999ccd-72c6-4053-87e5-c06267607d77" name="Default Changelist" comment="" />
<created>1751504716722</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1751504716722</updated>
<workItem from="1751504719564" duration="58000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
</project>

1
.svn/entries Normal file
View File

@ -0,0 +1 @@
12

1
.svn/format Normal file
View File

@ -0,0 +1 @@
12

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/com/googlecode/concurrentlinkedhashmap/concurrentlinkedhashmap-lru/1.4.2/concurrentlinkedhashmap-lru-1.4.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/com/googlecode/concurrentlinkedhashmap/concurrentlinkedhashmap-lru/1.4.2/concurrentlinkedhashmap-lru-1.4.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/com/googlecode/concurrentlinkedhashmap/concurrentlinkedhashmap-lru/1.4.2/concurrentlinkedhashmap-lru-1.4.2-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,72 @@
package com.cmeim.basic.po;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import javax.persistence.*;
import java.util.List;
@Data
@Entity
@Table(name = "ba_template")
public class BaTemplate {
/**
* null
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
@ApiParam(value = "null")
private Long id;
/**
* 模板名称
*/
@Column(name = "template_name")
@ApiParam(value = "模板名称")
private String templateName;
/**
* 模板编号
*/
@Column(name = "template_code")
@ApiParam(value = "模板编号")
private String templateCode;
/**
* null
*/
@Column(name = "created_dt")
@ApiParam(value = "null")
private String createdDt;
/**
* null
*/
@Column(name = "created_by")
@ApiParam(value = "null")
private String createdBy;
/**
* 模板大类
*/
@Column(name = "template_category")
@ApiParam(value = "模板大类")
private String templateCategory;
/**
* 模板类型
*/
@Column(name = "template_type")
@ApiParam(value = "模板类型")
private String templateType;
@Transient
@ApiParam(value = "创建时间集合")
private List<String> createdDtList;
@Transient
@ApiParam(value = "更新时间集合")
private List<String> updatedDtList;
}

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.github.jsqlparser:jsqlparser:4.3">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/com/github/jsqlparser/jsqlparser/4.3/jsqlparser-4.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/com/github/jsqlparser/jsqlparser/4.3/jsqlparser-4.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/com/github/jsqlparser/jsqlparser/4.3/jsqlparser-4.3-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,23 @@
package com.cmeim.biz.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Verasion:1.0
* @Author:DZY
* @Date:2022/5/12 红字查询
**/
@Data
public class InputListDto implements Serializable {
/**
* 入库单主表
*/
private InputBillNewDto inputBillDto;
/**
* 入库单子表
*/
private List<InputBillDetailNewDto> items;
}

View File

@ -0,0 +1,20 @@
package com.cmeim.common.security.feign;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import feign.RequestInterceptor;
/**
* Feign 配置注册
*
* @author ruoyi
**/
@Configuration
public class FeignAutoConfiguration
{
@Bean
public RequestInterceptor requestInterceptor()
{
return new FeignRequestInterceptor();
}
}

View File

@ -0,0 +1,820 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
:inline="true"
label-width="80px"
>
<el-form-item prop="number">
<el-input
v-model="queryParams.name"
placeholder="请输入工艺名称"
size="small"
style="width: 230px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item prop="bomName">
<el-input
v-model="queryParams.bomName"
size="small"
placeholder="请输入BOM版本"
style="width: 230px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item prop="dictStatus">
<el-select
size="small"
placeholder="请选择工艺状态"
v-model="queryParams.dictStatus"
style="width: 230px"
>
<el-option
v-for="(dict, index) in this.$dictType.getRouteStatusArray()"
:key="index"
:label="dict.text"
:value="dict.key"
/>
</el-select>
</el-form-item>
<el-form-item prop="dictType">
<el-select
size="small"
v-model="queryParams.dictType"
placeholder="请选择工艺类型"
style="width: 230px"
>
<el-option
v-for="(dict, index) in this.$dictType.getRouteTypeArray()"
:key="index"
:label="dict.text"
:value="dict.key"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['baRouter_add']"
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['baRouter_edit']"
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="single"
@click="handleDelete"
v-hasPermi="['baRouter_remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
icon="el-icon-upload2"
size="mini"
@click="handleImport"
v-hasPermi="['baRouter_import']"
>导入
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="openGraph"
v-hasPermi="['baRouter_openGraph']"
>工艺配置
</el-button>
</el-col>
<el-col :span="1.5">
<el-select
ref="select"
@click.native="notSelect"
style="width: 800px"
v-model="seqence"
:multiple="true"
placeholder=""
>
<el-option
v-for="item in seqenceOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-col>
<el-popover
style="float: right"
placement="bottom-end"
title="自定义显示列"
width="250"
@show="initPopover"
trigger="hover"
>
<headConfig
ref="test"
@fathers="fathers"
:propThis="propThis"
></headConfig>
<el-button
size="mini"
type="primary"
class="el-icon-caret-bottom"
slot="reference"
>自定义列</el-button
>
</el-popover>
</el-row>
<el-table
@sort-change="sortChange"
v-loading="loading"
:data="routeList"
@header-dragend="headerDragend"
lazy
v-if="indexShow"
highlight-current-row
@current-change="selectRow"
:tree-props="{ children: 'children', hasChildren: true }"
@selection-change="handleSelectionChange"
border
ref="list"
stripe
:height="tableHeight"
>
<el-table-column type="index" align="center" label="序号" width="50">
</el-table-column>
<!-- <el-table-column type="expand">-->
<!-- <template slot-scope="scope">-->
<!-- <el-table v-loading="subLoading" :data="childrenList" style="width: 80%"-->
<!-- class="two-list">-->
<!-- <el-table-column align="center" type="index" label="序号"></el-table-column>-->
<!-- <el-table-column prop="name" label="工序名称" width="200"></el-table-column>-->
<!-- <el-table-column prop="workCenterName" label="工作中心" width="200"></el-table-column>-->
<!-- <el-table-column prop="dictStatusShow" label="状态"></el-table-column>-->
<!-- <el-table-column prop="dictTypeShow" label="类型"></el-table-column>-->
<!-- <el-table-column prop="currentRevision" label="当前版本"></el-table-column>-->
<!-- </el-table>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column
v-for="(item, index) in realList"
:sortable="item.notSort == true ? false : `custom`"
:prop="item.tableProp"
:key="index"
:align="item.align"
header-align="center"
:min-width="item.width"
:label="item.tableTitle"
:show-overflow-tooltip="item.show_overflow_tooltip"
>
</el-table-column>
</el-table>
<el-pagination
style="margin-top: 10px"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="queryParams.pageNo"
:page-sizes="[10, 20, 50, 100, 200, 500, 1000]"
:page-size="queryParams.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
<!-- 用户导入对话框 -->
<el-dialog
:title="upload.title"
:visible.sync="upload.open"
width="400px"
append-to-body
>
<el-upload
ref="upload"
:limit="1"
accept=".xlsx, .xls"
:headers="headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
将文件拖到此处,或
<em>点击上传</em>
</div>
<div class="el-upload__tip" style="color: red" slot="tip">
提示仅允许导入“xls”或“xlsx”格式文件
</div>
<div class="el-upload__tip" style="color: red" slot="tip">
<el-link type="success" @click.prevent="down">下载模板</el-link>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm">确 定</el-button>
<el-button @click="upload.open = false">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import graphEdit from "./graphEdit";
import baRoute from "./ba-route-form";
// import bomList from './order-prod-valid'
import TreeSelect from "@riophae/vue-treeselect"; //引用下拉树组件
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
//引入css文件
import "@/assets/styles/cme-im-grid.scss";
import { getToken } from "@/utils/auth";
export default {
name: "OrderProd",
components: {
TreeSelect,
},
data() {
return {
normalizer(node) {
return {
id: node.value,
label: node.title,
children: node.children,
isDefaultExpanded: true,
};
},
// 用户导入参数
upload: {
// 是否显示弹出层(用户导入)
open: false,
// 弹出层标题(用户导入)
title: "",
// 是否禁用上传
isUploading: false,
// 是否更新已经存在的用户数据
updateSupport: 0,
// 设置上传的请求头部
// 上传的地址
url: "/dev-api/craft/craft/route/importExcel2",
},
propThis: this,
selectRowNow: {},
List: [],
realList: [],
tableHeight: 0,
indexShow: false,
treeValue: [],
treeOptions: [], //下拉树数据
routeList: [],
childrenList: [],
expendFlag: false,
subLoading: false,
// 遮罩层
dateRange: [],
loading: false,
orderStatus: [],
orderType: [],
// 选中数组
rows: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 总条数
total: 0,
// 用户表格数据
// 弹出层标题
// 表单参数
form: {
id: undefined,
number: "",
planQty: 0,
materialId: "",
bomId: "",
dictStatus: 1,
dictType: 1,
order: 99,
customerOrder: "",
customer: "",
autoOrderPicking: false,
autoOrderWork: false,
planStartDt: undefined,
planEndDt: undefined,
routeId: undefined,
workCenterId: undefined,
},
centerTree: [],
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 50,
number: undefined,
bomName: undefined,
dictStatus: undefined,
dictType: undefined,
workCenterId: undefined,
},
seqenceOptions: [],
seqence: [],
};
},
watch: {
seqence: function () {
this.getList();
},
},
computed: {
headers() {
return {
Authorization: "Bearer " + getToken(),
};
},
},
mounted() {
console.log(process.env.NODE_ENV,"渲染时候")
if (process.env.NODE_ENV == "development") {
this.upload.url = `/dev-api/craft/craft/route/importExcel2`;
} else {
this.upload.url = `/prod-api/craft/craft/route/importExcel2`;
}
},
created() {
let tempList = this.$headerConfig.getList("baRouter");
tempList.forEach((data, index) => {
if (data.notSort) return;
let temp = {
value: null,
label: null,
};
temp.value = data.tableProp.replace("Show", "") + " ascending";
temp.label = data.tableTitle + " 升序";
this.seqenceOptions.push(temp);
let tempD = {
value: null,
label: null,
};
tempD.value = data.tableProp.replace("Show", "") + " descending";
tempD.label = data.tableTitle + " 降序";
this.seqenceOptions.push(tempD);
});
this.initData();
},
methods: {
notSelect() {
this.$refs.select.blur();
},
sortChange({ column, prop, order }) {
console.log(prop);
let sTemp = {
value: null,
label: null,
};
let value = prop.replace("Show", "") + " " + order;
let judgeValue = value.split(" ");
// this.seqence.push(value)
if (this.seqence.length === 0) {
this.seqence.push(value);
} else {
for (let i = 0; i < this.seqence.length; i++) {
let judgeSeqence = this.seqence[i].split(" ");
if (judgeValue[0] === judgeSeqence[0]) {
if (judgeValue[1] === "null") {
return;
}
this.seqence.splice(i, 1, value);
console.log(this.seqence);
return;
}
if (i + 1 === this.seqence.length) {
this.seqence.push(value);
console.log(this.seqence);
}
}
}
},
headerDragend(newWidth, oldWidth, column, event) {
// realList
this.realList.forEach((value) => {
if (column.property == value.tableProp) {
value.width = newWidth;
}
});
this.$refs.test.init();
setTimeout(() => {
this.$refs.test.show();
}, 1000);
},
handleImport() {
this.upload.title = "工艺路线信息导入";
this.upload.open = true;
},
down() {
if (process.env.NODE_ENV == "development") {
window.location.href = `./down/route.xlsx`;
// 工艺路线信息导入 模板
} else {
window.location.href = `./down/route.xlsx`;
// 工艺路线信息导入 模板
}
},
// /** 下载模板操作 */
// importTemplate() {
// importTemplate().then(response => {
// this.download(response.msg)
// })
// },
// 文件上传中处理
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
// 文件上传成功处理
handleFileSuccess(response, file, fileList) {
this.upload.open = false;
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
this.$alert(response.data, "导入结果", {
dangerouslyUseHTMLString: true,
});
this.getList();
},
// 提交上传文件
submitFileForm() {
this.$refs.upload.submit();
},
initPopover() {
const params = {
tableName: "baRouter",
};
this.$headerConfig.getRealList(params).then((data) => {
// console.log("dsffwggerwer2w",data);
let temp = JSON.parse(data.data.data);
// console.log(temp);
this.realList = temp.headerList;
console.log(this.realList);
this.$refs.test.init();
});
},
fathers(data) {
this.List = data.configure.List;
data.configure.List.forEach((value) => {
this.realList.forEach((real) => {
if (value.tableProp == real.tableProp) {
value.width = real.width;
}
});
});
data.configure.headerList.forEach((value) => {
this.realList.forEach((real) => {
if (value.tableProp == real.tableProp) {
value.width = real.width;
}
});
});
if (data.configure.headerList.length <= 0) {
return;
}
const params = {
tableName: "baRouter",
configure: JSON.stringify(data.configure),
};
this.realList = data.configure.headerList;
this.$headerConfig.updateRealList(params).then((value) => {
console.log(value);
});
},
selectRow(val) {
this.single = false;
this.selectRowNow = val;
},
handleSizeChange(val) {
this.queryParams.pageSize = val;
this.getList();
},
handleCurrentChange(val) {
this.queryParams.pageNo = val;
this.getList();
},
//在method里面写上方法
// expandChange(value) {
// this.expendFlag = !this.expendFlag
// if (this.expendFlag) {
// this.getChildrenList(value.id)
// }
//
// },
//初始化表格
initData() {
this.getList();
this.getWorkCenterTree();
this.$nextTick(() => {
this.tableHeight =
window.innerHeight - this.$refs.queryForm.$el.offsetTop - 260;
// 监听窗口大小变化
let self = this;
window.onresize = function () {
self.tableHeight =
window.innerHeight - self.$refs.queryForm.$el.offsetTop - 260;
};
});
const params = {
tableName: "baRouter",
};
this.$headerConfig.getRealList(params).then((data) => {
console.log("开始输出真正表格");
if (data.data && data.data.data && data.data.data !== null) {
let temp = JSON.parse(data.data.data);
this.realList = temp.headerList;
this.List = temp.List;
} else {
this.List = this.$headerConfig.getList("baRouter");
this.realList = this.List;
let temp = {
headerList: this.realList,
List: this.List,
};
const params = {
tableName: "baRouter",
configure: JSON.stringify(temp),
};
this.$headerConfig.updateRealList(params).then((value) => {
console.log(value);
});
}
this.indexShow = true;
});
},
getWorkCenterTree() {
this.$plan.getWorkCenterTree().then((resp) => {
this.treeOptions = [];
this.treeOptions.push(resp.data.data);
this.removeBlackChildren(this.treeOptions);
});
},
removeBlackChildren(list) {
list.forEach((value) => {
if (value.children.length == 0) {
value.children = undefined;
} else {
this.removeBlackChildren(value.children);
}
});
},
/** 查询工艺列表 */
getList() {
this.loading = true;
const orders = [];
this.seqence.map((val) => {
orders.push(
val.replace("ascending", "asc").replace("descending", "desc")
);
});
this.queryParams.orders = orders;
this.$baRoute.getRouteList(this.queryParams).then((resp) => {
this.loading = false;
this.total = resp.data.data.recordsTotal;
this.routeList = resp.data.data.data;
this.routeList.forEach((value) => {
value.dictStatusShow = this.$dictType.getRouteStatus(
value.dictStatus
);
value.dictTypeShow = this.$dictType.getRouteType(value.dictType);
});
});
},
//获取工序
getChildrenList(routeId) {
this.subLoading = true;
let params = {
routeId,
};
this.$baRoute.getOperationListByRoute(params).then((resp) => {
this.subLoading = false;
if (resp.data.code == "200") {
this.childrenList = resp.data.data;
this.childrenList.forEach((value) => {
value.dictStatusShow = this.$dictType.getRouteStatus(
value.dictStatus
);
value.dictTypeShow = this.$dictType.getRouteType(value.dictType);
});
}
});
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNo = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams = {
pageNo: 1,
pageSize: 50,
number: undefined,
bomName: undefined,
dictStatus: undefined,
dictType: undefined,
workCenterId: undefined,
};
this.seqence = [];
// this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.rows = selection;
this.single = selection.length != 1;
this.multiple = !selection.length;
},
/** 新增按钮操作 */
handleAdd() {
this.$layer.iframe({
shadeClose: false,
content: {
content: baRoute, //传递的组件对象
parent: this, //当前的vue对象
},
area: ["730px", "400px"],
title: "创建工艺路线",
});
},
openGraph() {
console.log('1607')
this.$layer.iframe({
shadeClose: false,
content: {
content: graphEdit, //传递的组件对象
parent: this, //当前的vue对象
shadeClose: false,
data: {
formType: 1,
row: this.selectRowNow,
},
},
area: ["1200px", "670px"],
title: "编辑工艺路线",
});
},
handleUpdate() {
this.$layer.iframe({
shadeClose: false,
content: {
content: baRoute, //传递的组件对象
parent: this, //当前的vue对象
shadeClose: false,
data: {
formType: 1,
row: this.selectRowNow,
},
},
area: ["730px", "400px"],
title: "编辑工艺路线",
});
},
valid() {
// this.$layer.iframe({
// shadeClose:false,
// content: {
// content: bomList, //传递的组件对象
// parent: this,//当前的vue对象
// shadeClose: false,
// data: {
// rows:this.rows
// }
// },
// area: ['900px', '420px'],
// title: '齐套性判断'
// })
},
/** 删除按钮操作 */
handleDelete(row) {
row = this.selectRowNow;
this.$confirm("是否删除选中工艺路线【" + row.name + "】?", "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.$baRoute.deleteRoute({ id: row.id }).then((resp) => {
if (resp.data.code == "200") {
this.$message.success("删除成功!!");
this.getList();
}else{
}
}).catch(resp=>{
this.$message.error(resp.msg);
})
});
},
},
};
</script>
<style scoped lang="scss">
>>> .el-table--striped .el-table__body tr.el-table__row--striped.current-row td,
>>> .el-table__body tr.current-row > td {
background-color: #8ac1ff !important;
cursor: pointer;
}
>>> .el-table__body tr:hover > td {
background-color: #e9edf3 !important;
cursor: pointer;
}
>>> .el-link.el-link--default {
color: white;
}
.mb8 >>> .el-select .el-input__inner {
border: 0px;
}
.mb8 >>> .el-select .el-input__inner {
border: 0px;
padding-right: 35px;
}
>>> .el-input__suffix-inner {
display: none;
}
>>> .el-form-item {
margin-bottom: 10px;
}
.el-divider {
margin-top: 0px;
margin-bottom: 5px;
}
>>> .el-table .el-table__header-wrapper th {
padding: 5px 0;
}
</style>

View File

@ -0,0 +1,104 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" label-width="80px">
<el-form-item label="BOM名称" prop="materialId">
<el-input
v-model="queryParams.name"
placeholder="输入BOM名称"
clearable
size="small"
style="width: 200px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" border :data="BomList" @row-dblclick="handleDbClick" ref="list" height="400px">
<el-table-column label="BOM名称" align="center" prop="name" width="200" :show-overflow-tooltip="true"/>
<el-table-column label="BOM版本" align="center" prop="revision" width="200" :show-overflow-tooltip="true"/>
<el-table-column label="当前版本" align="center" prop="currentRevision" width="200" :show-overflow-tooltip="true"/>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- <order-prod-form :propThis="propsThis" ref="orderForm"></order-prod-form>-->
</div>
</template>
<script>
export default {
name: 'orderProd',
props: {
layerid: {
type: String,
default: ""
},
},
data() {
return {
loading:false,
total:0,
BomList:[],
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 50,
code: undefined,
name: undefined
}
}
},
watch: {},
mounted() {
this.initData()
},
methods: {
//初始化表格
initData() {
this.getList()
},
handleDbClick(row, event, column) {
this.$parent.getSelectBom(row);
this.$layer.close(this.layerid);
},
/** 查询订单列表 */
getList() {
this.loading = true
this.$plan.getBomList(this.queryParams).then(_data => {
let resp=_data.config?_data.data:_data
console.log(resp,'order-prod-select-bom getList')
this.loading = false;
this.total = resp.data.recordsTotal
this.BomList = resp.data.data
})
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNo = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = []
this.resetForm('queryForm')
this.handleQuery()
},
}
}
</script>

View File

@ -0,0 +1,123 @@
package com.cmeim.stock.controller;
import com.cmeim.common.core.exception.ServiceException;
import com.cmeim.common.core.web.controller.GenericController;
import com.cmeim.common.core.web.domain.Respond;
import com.cmeim.common.core.web.domain.RespondEnum;
import com.cmeim.common.core.web.page.PageVo;
import com.cmeim.common.log.annotation.Log;
import com.cmeim.common.log.enums.BusinessType;
import com.cmeim.stock.po.ContainerInfo;
import com.cmeim.stock.po.ShelfInfo;
import com.cmeim.stock.po.StationInfo;
import com.cmeim.stock.repository.ShelfInfoRepository;
import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;
/**
* @author 李俊辉
* @version 1.0
* date: 2023/6/28
*/
@Api(tags = "货架")
@RestController
@RequestMapping(value = "shelf")
@Slf4j
public class ShelfController extends GenericController {
@Autowired
private ShelfInfoRepository shelfInfoRepository;
@ApiOperation(value = "列表")
@GetMapping(value = "list")
public Respond list(PageVo pv, ShelfInfo shelfInfo) {
PageRequest pageRequest = PageRequest.of(pv.getPageNo() - 1, pv.getPageSize(),
Sort.by(sortOrder(shelfInfo.getOrders())));
Page page = shelfInfoRepository.findAll(buildSpecification(shelfInfo), pageRequest);
List<ShelfInfo> list = page.getContent();
pv.setRecordsTotal(page.getTotalElements());
pv.setData(list);
return buildSuccess(pv);
}
@ApiOperation(value = "修改货架状态")
@Log(title = "货架", businessType = BusinessType.UPDATE)
@PostMapping(value = "updateShelfStatus")
public Respond updateStationStatus(ShelfInfo shelfInfo) {
ShelfInfo shelf = shelfInfoRepository.findByShelfCode(shelfInfo.getShelfCode());
if (shelf == null) {
ServiceException exception = new ServiceException(RespondEnum.FAILURE);
exception.setErrorMessage("未找到该货架");
throw exception;
}
shelf.setShelfStatus(shelfInfo.getShelfStatus());
shelf.setQty(shelfInfo.getQty());
shelf.setUpdatedBy(shelfInfo.getUpdatedBy());
shelf.setUpdatedDt(shelfInfo.getUpdatedDt());
ShelfInfo save = shelfInfoRepository.save(shelf);
return buildSuccess(save);
}
@ApiOperation(value = "修改任务单优先级")
@Log(title = "货架", businessType = BusinessType.UPDATE)
@PostMapping(value = "updateShelfPriority")
public Respond updateShelfPriority(String productionTask) {
List<ShelfInfo> shelfInfoList = shelfInfoRepository.findByProductionTask(productionTask);
if (shelfInfoList.size() == 0) {
ServiceException exception = new ServiceException(RespondEnum.FAILURE);
exception.setErrorMessage("未找到该该任务对应的货架");
throw exception;
}
for (ShelfInfo shelfInfo : shelfInfoList) {
shelfInfo.setPriority(1);
}
shelfInfoRepository.saveAll(shelfInfoList);
return buildSuccess();
}
private Specification buildSpecification(ShelfInfo shelfInfo) {
Specification<ShelfInfo> specification = new Specification<ShelfInfo>() {
@Override
public Predicate toPredicate(Root<ShelfInfo> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> predicates = Lists.newArrayList();
if (shelfInfo.getShelfCode() != null) {
predicates.add(cb.like(root.get("shelfCode").as(String.class), "%" + shelfInfo.getShelfCode() + "%"));
}
if (shelfInfo.getProductionTask() != null) {
predicates.add(cb.like(root.get("productionTask").as(String.class), "%" + shelfInfo.getProductionTask() + "%"));
}
if (shelfInfo.getShelfStatus() != null) {
predicates.add(cb.equal(root.get("shelfStatus").as(Integer.class), shelfInfo.getShelfStatus()));
}
if (shelfInfo.getOrderStatus() != null) {
predicates.add(cb.equal(root.get("orderStatus").as(Integer.class), shelfInfo.getOrderStatus()));
}
if (shelfInfo.getOrderStatusArr() != null) {
CriteriaBuilder.In<Integer> in = cb.in(root.get("orderStatus").as(Integer.class));
for (Integer status : shelfInfo.getOrderStatusArr()) {
in.value(status);
}
predicates.add(in);
}
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
return specification;
}
}

View File

@ -0,0 +1,86 @@
package com.cmeim.common.core.utils.file;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 图片处理工具类
*
* @author ruoyi
*/
public class ImageUtils
{
private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
public static byte[] getImage(String imagePath)
{
InputStream is = getFile(imagePath);
try
{
return IOUtils.toByteArray(is);
}
catch (Exception e)
{
log.error("图片加载异常 {}", e);
return null;
}
finally
{
IOUtils.closeQuietly(is);
}
}
public static InputStream getFile(String imagePath)
{
try
{
byte[] result = readFile(imagePath);
result = Arrays.copyOf(result, result.length);
return new ByteArrayInputStream(result);
}
catch (Exception e)
{
log.error("获取图片异常 {}", e);
}
return null;
}
/**
* 读取文件为字节数据
*
* @param key 地址
* @return 字节数据
*/
public static byte[] readFile(String url)
{
InputStream in = null;
ByteArrayOutputStream baos = null;
try
{
// 网络地址
URL urlObj = new URL(url);
URLConnection urlConnection = urlObj.openConnection();
urlConnection.setConnectTimeout(30 * 1000);
urlConnection.setReadTimeout(60 * 1000);
urlConnection.setDoInput(true);
in = urlConnection.getInputStream();
return IOUtils.toByteArray(in);
}
catch (Exception e)
{
log.error("访问文件异常 {}", e);
return null;
}
finally
{
IOUtils.closeQuietly(baos);
}
}
}

View File

@ -0,0 +1,277 @@
package com.cmeim.biz.service;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.PascalNameFilter;
import com.cmeim.basic.api.dto.SyDictDto;
import com.cmeim.basic.api.enums.BaNumberRuleCode;
import com.cmeim.biz.po.MmElectronBill;
import com.cmeim.biz.po.MmElectronBillDetail;
import com.cmeim.biz.po.MmInputBill;
import com.cmeim.biz.po.MmInputBillDetail;
import com.cmeim.biz.po.MmSporadicPickBill;
import com.cmeim.biz.po.MmSporadicPickBillDetail;
import com.cmeim.biz.repository.MmElectronBillDetailRepository;
import com.cmeim.biz.repository.MmElectronBillRepository;
import com.cmeim.biz.vo.MmElectronBillVo;
import com.cmeim.biz.vo.MmPickBillVo;
import com.cmeim.common.core.exception.ServiceException;
import com.cmeim.common.core.utils.BeanUtil;
import com.cmeim.common.core.utils.DateUtil;
import com.cmeim.common.core.utils.SecurityUtils;
import com.cmeim.common.core.web.domain.TUserInfo;
import com.cmeim.kafka.api.Topic;
import com.cmeim.kafka.api.dto.output.BarDto;
import com.cmeim.kafka.api.dto.output.SporadicPickBillDto;
import com.cmeim.kafka.api.dto.output.SyncPickBillDto;
import com.cmeim.stock.dto.StockElectronDto;
import com.cmeim.stock.po.MmStock;
import com.cmeim.stock.repository.MmStockRepository;
import com.cmeim.wms.api.dto.MissPickListRDto;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 作者: 徐一码
* 时间: 2022/10/18
*
* @author XXL
*/
@Service
@Slf4j
@Transactional(rollbackFor = {ServiceException.class, RuntimeException.class, Exception.class})
public class MmElectronBillService {
@Autowired
private InputRemoteService remoteService;
@Autowired
private MmElectronBillRepository electronBillRepository;
@Autowired
private MmElectronBillDetailRepository electronBillDetailRepository;
@Autowired
private KafkaTemplate kafkaTemplate;
@Autowired
private MmStockRepository stockRepository;
public Specification buildSpecification(MmElectronBillVo entity) {
Specification specification = (Specification<MmElectronBill>) (root, criteriaQuery, cb) -> {
List<Predicate> predicates = Lists.newArrayList();
String electronBillNumber = "electronBillNumber";
String orderWorkNumbers = "orderWorkNumbers";
String orderProdNumbers = "orderProdNumbers";
String items = "items";
if (StringUtils.isNotBlank(entity.getElectronBillNumber())) {
String[] pickBillNumbers = entity.getElectronBillNumber().split(" ");
if (pickBillNumbers.length > 1) {
CriteriaBuilder.In<String> in = cb.in(root.get(electronBillNumber).as(String.class));
for (String materialCode : pickBillNumbers) {
in.value(materialCode);
}
predicates.add(in);
} else {
predicates.add(cb.like(root.get(electronBillNumber).as(String.class),
"%" + entity.getElectronBillNumber() + "%"));
}
}
if (StringUtils.isNotBlank(entity.getMaterialCode())) {
Path path;
Join join = root.join(items, JoinType.LEFT);
path = join.get("materialCode");
predicates.add(cb.like(path, "%" + entity.getMaterialCode() + "%"));
}
if (StringUtils.isNotBlank(entity.getMaterialName())) {
Path path;
Join join = root.join(items, JoinType.LEFT);
path = join.get("materialName");
predicates.add(cb.like(path, "%" + entity.getMaterialName() + "%"));
}
if (StringUtils.isNotBlank(entity.getMaterialSpec())) {
Path path;
Join join = root.join(items, JoinType.LEFT);
path = join.get("materialSpec");
predicates.add(cb.like(path, "%" + entity.getMaterialSpec() + "%"));
}
criteriaQuery.distinct(true);
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
return specification;
}
/**
* 电子料仓单新增
* @param mmElectronBill
*/
public void add(MmElectronBill mmElectronBill) {
String electronBillNumber = remoteService.getByCode(BaNumberRuleCode.ELECTRONBILL);
String createdDt = DateUtil.getCurrentDate();
String createdBy = SecurityUtils.getUsername();
mmElectronBill.setElectronBillNumber(electronBillNumber);
mmElectronBill.setDictStatus(0);
mmElectronBill.setCreatedDt(createdDt);
mmElectronBill.setCreatedBy(createdBy);
mmElectronBill.getItems().forEach(data ->{
data.setElectronBillNumber(electronBillNumber);
data.setDictStatus(0);
data.setCreatedDt(createdDt);
data.setCreatedBy(createdBy);
});
electronBillRepository.save(mmElectronBill);
}
public void update(MmElectronBill mmElectronBill) {
String dt = DateUtil.getCurrentDate();
String by = SecurityUtils.getUsername();
MmElectronBill bill = BeanUtil.copyProperties(mmElectronBill, MmElectronBill.class);
bill.setUpdatedDt(dt);
bill.setUpdatedBy(by);
bill.getItems().forEach(data ->{
if (data.getId() == null) {
data.setElectronBillNumber(mmElectronBill.getElectronBillNumber());
data.setDictStatus(0);
data.setCreatedDt(dt);
data.setCreatedBy(by);
}
if (data.getId() != null) {
data.setUpdatedBy(by);
data.setUpdatedDt(dt);
}
});
electronBillDetailRepository.deleteAllByElectronBillId(mmElectronBill.getId());
electronBillRepository.save(mmElectronBill);
}
/**
* 打印数据
*
* @param list 入库单list
* @param cloumns 列数组
* @return 返回值
*/
public List<Object[]> initPrintData(List<MmElectronBill> list, String[] cloumns) {
List<Object[]> datalist = new ArrayList<>();
// 状态
/*SyDictDto dto = new SyDictDto();
dto.setGroupCode("mm_input_bill_status");
List<SyDictDto> inputBillStatus = remoteSyDictService.query(dto).getData();*/
for (MmElectronBill mmElectronBill : list) {
List<MmElectronBillDetail> items = mmElectronBill.getItems();
datalist = buildData(items, cloumns, mmElectronBill);
}
return datalist;
}
public List<Object[]> buildData(List<MmElectronBillDetail> items, String[] cloumns, MmElectronBill mmElectronBill) {
int index = 1;
List<Object[]> datalist = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
MmElectronBillDetail item = items.get(i);
Object[] data = new Object[cloumns.length];
data[0] = index;
index++;
if (i == 0) {
// 电子料仓单
data[1] = mmElectronBill.getElectronBillNumber();
//仓库代码
data[2] = mmElectronBill.getWarehouseCode();
// 仓库名称
data[3] = mmElectronBill.getWarehouseName();
}
// 批次
data[4] = item.getBatchNo();
data[5] = item.getMaterialCode();
data[6] = item.getMaterialName();
data[7] = item.getMaterialSpec();
data[8] = item.getMaterialBar();
data[9] = item.getDictStatus() == 0 ? "待取料" : "已取料";
data[10] = item.getBarQty();
data[11] = item.getCreatedBy();
data[12] = item.getCreatedDt();
data[13] = item.getUpdatedBy();
data[14] = item.getUpdatedDt();
datalist.add(data);
}
return datalist;
}
public void delete(List<Long> ids) {
List<MmElectronBill> allById = electronBillRepository.findAllById(ids);
electronBillRepository.deleteAll(allById);
}
/**
* syncPickBillSporadicPick
*/
@Transactional
public void syncPickBillSporadicPick(MmElectronBillVo mmElectronBillVo) {
SporadicPickBillDto sporadicPickBillDto = new SporadicPickBillDto();
List<BarDto> barDtoList = new ArrayList<>();
//判断 最优先的条码
sporadicPickBillDto.setItemType("1");
sporadicPickBillDto.setTaskType("1");
sporadicPickBillDto.setPickType("领料");
sporadicPickBillDto.setTaskNo(mmElectronBillVo.getElectronBillNumber());
for (MmElectronBillDetail mm : mmElectronBillVo.getItems()) {
BarDto barDto = new BarDto();
barDto.setUID(mm.getMaterialBar());
barDtoList.add(barDto);
}
sporadicPickBillDto.setItemList(barDtoList);
log.info("下发智能仓储柜data:{}, result:{}",sporadicPickBillDto, new PascalNameFilter());
//通过kafka的形式给边缘端发送信息
kafkaTemplate.send(Topic.Output.OUTPUT_SYNC_PICKBILL_TEST, JSONObject.toJSONString(sporadicPickBillDto, new PascalNameFilter()));
}
public List<MmStock> selectStock(MmElectronBillVo syncPickBillDto) {
List<Integer> lists = new ArrayList<>();
lists.add(20);
lists.add(30);
return stockRepository.findAll(buildSpecificationSelectStock(syncPickBillDto,lists));
}
private Specification buildSpecificationSelectStock(MmElectronBillVo syncPickBillDto, List<Integer> dictStatus) {
Specification<MmElectronBillVo> specification = (Specification<MmElectronBillVo>) (root, criteriaQuery, cb) -> {
List<Predicate> predicates = Lists.newArrayList();
if (com.cmeim.common.core.utils.StringUtils.isNotBlank(syncPickBillDto.getMaterialCode())) {
predicates.add(cb.like(root.get("materialCode").as(String.class),
"%" + syncPickBillDto.getMaterialCode() + "%"));
}
if (com.cmeim.common.core.utils.StringUtils.isNotBlank(syncPickBillDto.getMaterialName())) {
predicates.add(cb.like(root.get("materialName").as(String.class),
"%" + syncPickBillDto.getMaterialName() + "%"));
}
if (com.cmeim.common.core.utils.StringUtils.isNotBlank(syncPickBillDto.getWarehouseCode())) {
predicates.add(cb.equal(root.get("warehouseCode").as(String.class),syncPickBillDto.getWarehouseCode()));
}
if(dictStatus != null && dictStatus.size() > 0){
CriteriaBuilder.In<Integer> in = cb.in(root.get("warehouseType"));
for (Integer id : dictStatus) {
in.value(id);
}
predicates.add(in);
}
criteriaQuery.distinct(true);
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
return specification;
}
}

View File

@ -0,0 +1,33 @@
package com.cmeim.gateway.config.properties;
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
/**
* 放行白名单配置
*
* @author ruoyi
*/
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "ignore")
public class IgnoreWhiteProperties
{
/**
* 放行白名单配置,网关不校验此处的白名单
*/
private List<String> whites = new ArrayList<>();
public List<String> getWhites()
{
return whites;
}
public void setWhites(List<String> whites)
{
this.whites = whites;
}
}

View File

@ -0,0 +1,109 @@
<template>
<!-- 帆软报表-->
<div class="full-screen">
<div v-if="isFrameShow" class="main-section flex-column">
<iframe ref="activit" :src="src" class="iframe" height="100%" width="100%"
@load="handleIframeLoaded"></iframe>
</div>
<span v-else style="text-align:center;">
<i class="el-icon-loading"></i>
正在加载中 请稍等
</span>
</div>
</template>
<script>
import importModal from '@/components/buttons/import/modal'
export default {
data() {
return {
isFrameShow: false,
userList: [], //传给子页面的用户列表
roleList: [],//传给子页面的角色列表,
path: "",
handledPaths: ['生产报表/生产日报表']
};
},
computed: {
src() {
if (this.handledPaths.includes(this.path)) {
return `/webroot/decision/view/report?viewlet=MX/${this.path}.cpt`
}
return "https://fineReport.cme-im.com/webroot/decision/view/report?viewlet=MX/" + this.path + ".cpt"//this.$store.modelId;//activiti主html路径
},
apiUrl() {
//被public里的app-cfg.js调用
return [process.env.VUE_APP_BASE_API] + "/basic/activiti6/modeler";//后台部署的api服务
},
token() {
//被public里的modeler.html里的open方法调用
// return getToken();//token
}
},
async created() {
if (this.$route.path[0] === '/') {
this.path = this.$route.path.substring(1)
} else {
this.path = this.$route.path
}
this.isFrameShow = true
},
methods: {
goto() {
console.log('goto')
this.$message.success("保存模型成功");
this.$emit("closeSubPage")
// this.$router.push({name:"/sys/activiti"})
},
handleIframeLoaded() {
if (!this.handledPaths.includes(this.path)) return
// 第一个是 生产日报表
if (this.path === this.handledPaths[0]) {
this.dealDailyReport()
}
},
dealDailyReport() {
const iframeEl = this.$refs.activit
if (!iframeEl) return
const buttonsEl = iframeEl.contentWindow.document.querySelector('.bi-button-group')
if (!buttonsEl) {
setTimeout(() => {
this.dealDailyReport()
}, 100)
return
}
const newNode = buttonsEl.children[7].cloneNode(true)
newNode.innerHTML = newNode.innerHTML.replace('邮件', '导入')
.replaceAll('base-disabled', '')
.replaceAll('disabled', '')
.replaceAll('mail-font', 'import-font')
newNode.onclick = () => {
importModal({
title: '导入生产日报表',
uploadUrl: '/report/workReport/import',
downloadUrl: '/report/workReport/exportExample',
downloadFileName: '生产日报表模板'
})
}
// buttonsEl.insertBefore(buttonsEl.children[7], newNode)
buttonsEl.appendChild(newNode)
}
}
}
</script>
<style lang="scss" scoped>
.iframe {
width: 100%;
height: calc(100vh - 94px);
}
> > > .copyrightInfo-div {
display: none !important;
}
</style>

View File

@ -0,0 +1,231 @@
<template>
<div style="width: 1200px">
<el-table
v-loading="loading"
:data="serialList"
border
highlight-current-row
stripe
ref="list"
height="400px"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="50"> </el-table-column>
<el-table-column
label="序号"
align="center"
type="index"
width="50"
:show-overflow-tooltip="true"
/>
align="center"
<el-table-column
label="是否筛选"
align="center"
prop="isFil"
:formatter="stateFormat"
width="100"
>
</el-table-column>
<el-table-column
label="包装条码"
align="center"
prop="materialBar"
width="300"
>
</el-table-column>
<el-table-column
label="物料编码"
align="left"
header-align="center"
prop="materialCode"
width="220"
:show-overflow-tooltip="true"
>
</el-table-column>
<el-table-column
label="物料名称"
align="left"
header-align="center"
width="220"
prop="materialName"
:show-overflow-tooltip="true"
>
</el-table-column>
<el-table-column
label="物料规格"
align="left"
header-align="center"
prop="materialSpec"
width="220"
:show-overflow-tooltip="true"
/>
<el-table-column
label="库存数量"
prop="qty"
align="center"
width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
label="领料数量"
align="center"
width="120"
:show-overflow-tooltip="true"
>
<template scope="scope">
<el-input-number
:controls="false"
style="width: 80px"
:min="0"
:max="scope.row.qty"
v-model="scope.row.outQty"
></el-input-number>
</template>
</el-table-column>
<el-table-column
label="单位"
prop="materialUnit"
width="50"
align="center"
:show-overflow-tooltip="true"
/>
<el-table-column
label="创建人"
align="center"
prop="createdBy"
width="100"
:show-overflow-tooltip="true"
/>
<el-table-column
label="创建时间"
align="center"
prop="createdDt"
width="180"
:show-overflow-tooltip="true"
/>
<el-table-column
label="修改人"
align="center"
prop="updatedBy"
width="100"
:show-overflow-tooltip="true"
/>
<el-table-column
label="修改时间"
align="center"
prop="updatedDt"
width="160"
:show-overflow-tooltip="true"
/>
</el-table>
<el-row>
<el-col>
<el-button
style="margin-left:43%"
type="primary"
@click="submitForm"
:disabled="this.selectList.length <= 0"
>确 定</el-button
>
<el-button @click="cancel">取 消</el-button>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name: "ass",
props: {
layerid: {
type: String,
default: "",
},
row: {
type: Object,
default: () => ({}),
},
},
mounted() {
// this.rows=this.row
this.getStockList();
},
data() {
return {
serialList: [],
loading: false,
rows: {},
isshow: true,
selectList: [],
};
},
methods: {
stateFormat(row, column) {
if (row.isFil === "Y") {
return "是";
} else {
return "否";
}
},
getStockList() {
let params = {
materialCode: this.row.materialNumber,
materialId: this.row.materialId,
isFil: this.row.isFil,
};
this.$pickDetail.StockList(params).then((resp) => {
if (resp.data.code == 200) {
resp.data.data.forEach((e) => {
e.outQty = "";
});
this.serialList = resp.data.data;
console.log("拿到数据哈", this.serialList);
}
});
},
// 多选框选中数据
handleSelectionChange(selection) {
this.selectList = selection;
},
cancel() {
// this.$parent.initData();
this.$layer.close(this.layerid);
},
submitForm() {
let obj = {};
let recommends = [];
this.selectList.forEach((e) => {
obj = {};
obj.stockId = e.id;
obj.outQty = e.outQty;
recommends.push(obj);
});
for(let i=0;i<recommends.length;i++){
if(recommends[i].outQty==0){
this.$message.error("领料数量不能为空!")
return;
}
}
let params = {
detail: this.row,
recommends,
};
this.$pick.recommends(params).then((resp) => {
if (resp.data.code == 200) {
this.$message.success("提交成功!");
this.$parent.getPickBillList();
this.$layer.close(this.layerid);
} else {
this.$message.error(resp.data.message);
}
});
},
},
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,16 @@
package com.cmeim.biz.vo.app;
import com.cmeim.biz.po.MmMaterialBar;
import io.swagger.annotations.ApiParam;
import lombok.Data;
@Data
public class MaterialBarVo extends MmMaterialBar {
@ApiParam("物料规格")
private String materialSpec;
@ApiParam(value = "条码状态")
private String dictStatusShow;
}

View File

@ -0,0 +1,35 @@
// base color
$blue:#324157;
$light-blue:#3A71A8;
$red:#C03639;
$pink: #E65D6E;
$green: #30B08F;
$tiffany: #4AB7BD;
$yellow:#FEC171;
$panGreen: #30B08F;
// sidebar
$menuText:#bfcbd9;
$menuActiveText:#409EFF;
$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
$menuBg:#304156;
$menuHover:#263445;
$subMenuBg:#1f2d3d;
$subMenuHover:#001528;
$sideBarWidth: 200px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
menuText: $menuText;
menuActiveText: $menuActiveText;
subMenuActiveText: $subMenuActiveText;
menuBg: $menuBg;
menuHover: $menuHover;
subMenuBg: $subMenuBg;
subMenuHover: $subMenuHover;
sideBarWidth: $sideBarWidth;
}

View File

@ -0,0 +1,269 @@
<template>
<!-- wms到货单生成检验单 -->
<el-container style="margin-top: 10px;" v-loading="loading">
<!-- 添加或修改参数配置对话框 -->
<el-form
ref="form"
:model="form"
label-width="120px"
:rules="rules"
align="left"
style="width: 100%;"
>
<!-- 列表 -->
<el-table
style="width: 99%;margin: 10px 0px 0px 5px;"
height="560"
border
v-loading="tableLoading"
:data="detailList"
ref="list"
@selection-change="handleSelectionChange"
>
<el-table-column align="center" type="index" label="序号" width="50" />
<el-table-column type="selection" width="50" />
<!-- <el-table-column label="检验单号" align="center" prop="inspectBillNumber" width="150px" :show-overflow-tooltip="true"/> -->
<!-- <el-table-column label="到货单号" align="center" prop="arriveBillNumber" width="150px" :show-overflow-tooltip="true"/> -->
<!-- <el-table-column label="物料条码" align="center" prop="materialBar" width="100px" :show-overflow-tooltip="true"/> -->
<el-table-column
label="物料编码"
align="center"
prop="materialCode"
width="100px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="物料名称"
align="center"
prop="materialName"
width="150px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="物料规格"
align="center"
prop="materialSpec"
width="150px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="检验总数"
align="center"
prop="inspectTotalQty"
width="100px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="抽检数量"
align="center"
prop="spotCheckQty"
width="100px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="抽检标准数"
align="center"
prop="spotCheckStandardQty"
width="100px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="抽检合格数"
align="center"
prop="spotCheckQualifiedQty"
width="150px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="抽检不合格数"
align="center"
prop="spotCheckUnqualifiedQty"
width="150px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="批次号"
align="center"
prop="batchNo"
width="100px"
:show-overflow-tooltip="true"
/>
</el-table>
<!-- 表单按钮 -->
<el-row style="margin-top:20px">
<el-col :span="24">
<el-form-item style="float: right;margin-right: 20px">
<el-button
type="primary"
@click="submitAllForm"
v-loading="saveLoading"
>全部入库</el-button
>
<el-button
type="primary"
@click="submitPartForm"
v-loading="saveLoading"
>分单入库</el-button
>
<el-button @click="cancel">取 消</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<SelectWidget ref="selectWidget" @getSelect="getSelect"></SelectWidget>
</el-container>
</template>
<script>
import SelectWidget from "@/views/components/select-widget/select-widget";
export default {
components: {
SelectWidget
},
props: {
layerid: {
type: String,
default: ""
},
row: {
type: Object,
default: undefined
},
formType: {
type: Number,
default: 0
}
},
data() {
return {
loading: false,
form: {},
rules: {},
tableLoading: false,
detailList: [],
saveLoading: false,
multipleSelectionTable: []
};
},
async mounted() {},
created() {
console.log(this.row);
this.initData();
},
methods: {
//初始化
initData() {
this.loading = true;
this.$inspectBill.queryInspectDetail(this.row.id).then(res => {
this.detailList = res.data.data;
this.detailList = this.detailList.filter(
detail => detail.dictStatus < 15
);
this.detailList.forEach(item => {
item.dictStatusShow = this.$dictType.getDictNameByCodeAndKey(
"mm_inspect_bill_status",
item.dictStatus
);
});
this.loading = false;
});
},
//保存按钮
submitAllForm() {
if (this.multipleSelectionTable.length == 0) {
this.$message.error("请至少选择一条数据");
return;
}
if (this.saveLoading) return;
this.saveLoading = true;
let detailIds = [];
this.multipleSelectionTable.forEach(data => {
detailIds.push(data.id);
});
let dto = {
id: this.row.id,
detailIds: detailIds
};
this.$inspectBill
.addByInspect(dto)
.then(res => {
if (res.data.code == 200) {
this.$message.success("办理成功");
this.$parent.getList();
this.cancel();
} else {
this.$message.error(res.data.msg);
this.saveLoading = false;
}
})
.catch(() => {
this.saveLoading = false;
});
},
//保存按钮
submitPartForm() {
if (this.multipleSelectionTable.length == 0) {
this.$message.error("请至少选择一条数据");
return;
}
if (this.saveLoading) return;
this.saveLoading = true;
this.$refs.selectWidget.selectWidget(3);
return;
},
//取消按钮
cancel() {
this.$layer.close(this.layerid);
},
//列表多选
handleSelectionChange(selection) {
this.multipleSelectionTable = selection;
},
getSelect(row, index) {
//查询选择回调 0物料 1 BOM 2工艺
console.log(this.selectWidgetArray, "1834");
console.log(row, index, "1910");
if (index === 3) {
console.log(row, index, "19113");
}
this.$inspectBill
.batchInput({
inspectBillNumber: this.row.inspectBillNumber,
warehouseCode: row.warehouseCode
})
.then(res => {
if (res.data.code == 200) {
this.$message.success("办理成功");
this.$parent.getList();
this.cancel();
} else {
this.$message.error(res.data.msg);
this.saveLoading = false;
}
})
.catch(() => {
this.saveLoading = false;
});
}
}
};
</script>
<style lang="scss" scoped>
.el-form-item {
margin-bottom: 10px;
}
>>> .el-table__body tr.current-row > td {
background-color: #8ac1ff !important;
cursor: pointer;
}
.el-table >>> tbody tr:hover > td {
background-color: #8ac1ff !important;
}
.input_inner /deep/ .el-input__inner {
background-color: white !important;
}
</style>

View File

@ -0,0 +1,40 @@
package com.cmeim.basic.exception.code;
import lombok.Getter;
/**
* @author wuyuqi
* @since 2022/8/31 13:05
*/
public enum BaShiftExceptionCode {
DUPLICATE_SHIFT(301, "班制名或编码重复"),
DUPLICATE_TIME(302, "班次名或编码重复"),
SHIFT_NOT_FOUND(303, "找不到指定班制"),
TIME_NOT_FOUND(304, "找不到指定班次"),
TIMES_EXISTS(305, "此班制下仍然有班次存在"),
DELETE_FAILED(306, "删除失败"),
DUPLICATE_REST_EXTRA_TIME(307, "加班时间或休息时间中冲突"),
START_TIME_WRONG(308, "时间段结束时间需大于开始时间"),
TIME_START_TIME_WRONG(309, "班次结束时间需大于开始时间"),
TIME_OVER_BORDER(310, "存在休息时间或者加班时间不在班次时间内"),
ORG_NOT_FOUND(311, "找不到指定的工作中心"),
CALENDAR_NOT_FOUND(312, "找不到相关的生产日历"),
DUPLICATE_RESOURCE(313, "存在重复的生产资源日历"),
WRONG_SHIFT_TIME(314, "班制下的班次存在时间冲突"),
MORE_THAN_24_HOURS(315, "班制下班次时间超过24小时");
@Getter
private final int code;
@Getter
private final String message;
BaShiftExceptionCode(int code, String message) {
this.code = code;
this.message = message;
}
}

View File

@ -0,0 +1,147 @@
package com.cmeim.system.controller;
import com.cmeim.common.core.constant.UserConstants;
import com.cmeim.common.core.domain.R;
import com.cmeim.common.core.utils.SecurityUtils;
import com.cmeim.common.core.utils.ServletUtils;
import com.cmeim.common.core.utils.StringUtils;
import com.cmeim.common.core.web.controller.BaseController;
import com.cmeim.common.core.web.domain.AjaxResult;
import com.cmeim.common.log.annotation.Log;
import com.cmeim.common.log.enums.BusinessType;
import com.cmeim.common.security.service.TokenService;
import com.cmeim.system.api.RemoteFileService;
import com.cmeim.system.api.domain.SysFile;
import com.cmeim.system.api.domain.SysUser;
import com.cmeim.system.api.model.LoginUser;
import com.cmeim.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* 个人信息 业务处理
*
* @author ruoyi
*/
@RestController
@RequestMapping("/user/profile")
public class SysProfileController extends BaseController
{
@Autowired
private ISysUserService userService;
@Autowired
private TokenService tokenService;
@Autowired
private RemoteFileService remoteFileService;
/**
* 个人信息
*/
@GetMapping
public AjaxResult profile()
{
String username = SecurityUtils.getUsername();
SysUser user = userService.selectUserByUserName(username);
AjaxResult ajax = AjaxResult.success(user);
ajax.put("roleGroup", userService.selectUserRoleGroup(username));
ajax.put("postGroup", userService.selectUserPostGroup(username));
return ajax;
}
/**
* 修改用户
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult updateProfile(@RequestBody SysUser user)
{
if (StringUtils.isNotEmpty(user.getPhonenumber())
&& UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
{
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
{
return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
if (userService.updateUserProfile(user) > 0)
{
LoginUser loginUser = tokenService.getLoginUser();
// 更新缓存用户信息
loginUser.getSysUser().setNickName(user.getNickName());
loginUser.getSysUser().setPhonenumber(user.getPhonenumber());
loginUser.getSysUser().setEmail(user.getEmail());
loginUser.getSysUser().setSex(user.getSex());
tokenService.setLoginUser(loginUser);
return AjaxResult.success();
}
return AjaxResult.error("修改个人信息异常,请联系管理员");
}
/**
* 重置密码
*/
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping("/updatePwd")
public AjaxResult updatePwd(String oldPassword, String newPassword) {
String username = SecurityUtils.getUsername();
SysUser user = userService.selectUserByUserName(username);
String password = user.getPassword();
if (!SecurityUtils.matchesPassword(oldPassword, password)) {
return AjaxResult.error("修改密码失败,旧密码错误");
}
if (SecurityUtils.matchesPassword(newPassword, password)) {
return AjaxResult.error("新密码不能与旧密码相同");
}
if (!(newPassword.length()>=6 && newPassword.length() <=20)) {
return AjaxResult.error("长度在 6 到 20 个字符");
}
String regex = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$";
if (!(newPassword.matches(regex))) {
return AjaxResult.error("新密码请包含大小写字母和数字");
}
if (userService.resetUserPwd(username, SecurityUtils.encryptPassword(newPassword)) > 0) {
// 更新缓存用户密码
LoginUser loginUser = tokenService.getLoginUser();
loginUser.getSysUser().setPassword(SecurityUtils.encryptPassword(newPassword));
tokenService.setLoginUser(loginUser);
return AjaxResult.success();
}
return AjaxResult.error("修改密码异常,请联系管理员");
}
/**
* 头像上传
*/
@Log(title = "用户头像", businessType = BusinessType.UPDATE)
@PostMapping("/avatar")
public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException
{
if (!file.isEmpty())
{
LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
R<SysFile> fileResult = remoteFileService.upload(file);
if (StringUtils.isNull(fileResult) || StringUtils.isNull(fileResult.getData()))
{
return AjaxResult.error("文件服务异常,请联系管理员");
}
String url = fileResult.getData().getUrl();
if (userService.updateUserAvatar(loginUser.getUsername(), url))
{
AjaxResult ajax = AjaxResult.success();
ajax.put("imgUrl", url);
// 更新缓存用户头像
loginUser.getSysUser().setAvatar(url);
tokenService.setLoginUser(loginUser);
return ajax;
}
}
return AjaxResult.error("上传图片异常,请联系管理员");
}
}

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.checkerframework:checker-qual:2.11.1">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/checkerframework/checker-qual/2.11.1/checker-qual-2.11.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/checkerframework/checker-qual/2.11.1/checker-qual-2.11.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/checkerframework/checker-qual/2.11.1/checker-qual-2.11.1-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,100 @@
package com.cmeim.basic.po;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
@Data
@Entity
@Table(name = "ba_printer_type_args")
public class BaPrinterTypeArgs implements Serializable {
/**
* null
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
@ApiParam(value = "null")
private Long id;
/**
* null
*/
@Column(name = "template_id")
@ApiParam(value = "null")
private Long templateId;
/**
* null
*/
@Column(name = "dict_type")
@ApiParam(value = "null")
private Integer dictType;
/**
* null
*/
@Column(name = "params_content")
@ApiParam(value = "null")
private String paramsContent;
/**
* null
*/
@Column(name = "width")
@ApiParam(value = "null")
private Integer width;
/**
* null
*/
@Column(name = "height")
@ApiParam(value = "null")
private Integer height;
/**
* null
*/
@Column(name = "axisX")
@ApiParam(value = "null")
private Integer axisX;
/**
* null
*/
@Column(name = "axisY")
@ApiParam(value = "null")
private Integer axisY;
/**
* null
*/
@Column(name = "created_by")
@ApiParam(value = "null")
private String createdBy;
/**
* null
*/
@Column(name = "created_dt")
@ApiParam(value = "null")
private String createdDt;
/**
* null
*/
@Column(name = "updated_by")
@ApiParam(value = "null")
private String updatedBy;
/**
* null
*/
@Column(name = "updated_dt")
@ApiParam(value = "null")
private String updatedDt;
}

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apache.httpcomponents:httpclient:4.5.13">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../server/maven/repository/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../server/maven/repository/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../server/maven/repository/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,391 @@
package com.cmeim.biz.controller.app;
import com.cmeim.basic.api.RemoteLocationService;
import com.cmeim.biz.po.MmMaterialBar;
import com.cmeim.biz.po.MmSporadicPickBill;
import com.cmeim.biz.po.MmSporadicPickBillDetail;
import com.cmeim.biz.po.MmSporadicPickBillItem;
import com.cmeim.biz.repository.MmSporadicPickBillDetailRepository;
import com.cmeim.biz.repository.MmSporadicPickBillItemRepository;
import com.cmeim.biz.repository.MmSporadicPickBillRepository;
import com.cmeim.biz.service.OutputAppService;
import com.cmeim.biz.service.SporadicPickBillService;
import com.cmeim.biz.vo.InputBillDetailVo;
import com.cmeim.biz.vo.MmPickBillVo;
import com.cmeim.biz.vo.MmSporadicPickBillVo;
import com.cmeim.biz.vo.app.FndByPickNumberVo;
import com.cmeim.biz.vo.app.SporadicPickBillAppVo;
import com.cmeim.biz.vo.app.SporadicPickBillDetailVo;
import com.cmeim.biz.vo.app.SporadicPickSaveVo;
import com.cmeim.biz.vo.app.SporadicRedPickSaveVo;
import com.cmeim.common.core.utils.BeanUtil;
import com.cmeim.common.core.utils.DateUtil;
import com.cmeim.common.core.utils.SecurityUtils;
import com.cmeim.common.core.utils.bean.BeanUtils;
import com.cmeim.common.core.web.controller.GenericController;
import com.cmeim.common.core.web.domain.Respond;
import com.cmeim.common.core.web.page.PageVo;
import com.cmeim.stock.dto.MmStockDto;
import com.cmeim.stock.po.MmStock;
import com.cmeim.stock.repository.MmStockRepository;
import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@Api(value = "app", tags = "APP零星出库模块")
@RestController
@RequestMapping(value = "output/app/sporadicPickBill")
public class AppSporadicPickBillController extends GenericController {
@Autowired
private OutputAppService appService;
@Autowired
private SporadicPickBillService service;
@Autowired
private MmSporadicPickBillRepository repository;
@Autowired
private MmSporadicPickBillDetailRepository detailRepository;
@Autowired
private RemoteLocationService locationService;
@Autowired
private MmSporadicPickBillItemRepository sporadicPickBillItemRepository;
@Autowired
private MmStockRepository mmStockRepository;
private static final String sporadicPickBillNumber = "sporadicPickBillNumber";
/**
* IF-150:pc未完成领料单列表 工单 领料单号
*/
@ApiOperation(value = "IF-150:pc未完成领料单列表 工单 领料单号")
@GetMapping(value = "missPickList2")
public Respond missPickList2(PageVo pv, String parameter) {
String[] orders = {"sporadicPickBillNumber desc"};
pv.setPageSize(50);
pv.setPageNo(1);
PageRequest pageRequest = PageRequest.of(pv.getPageNo() - 1, pv.getPageSize(),
Sort.by(sortOrder(orders)));
Integer[] dictStatus = new Integer[2];
dictStatus[0] = 15; // 部分领料
dictStatus[1] = 20; // 全部领料
MmSporadicPickBillVo mmPickBillVo = new MmSporadicPickBillVo();
mmPickBillVo.setDictStatusArr(dictStatus);
Page page = repository.findAll(buildSpecification(mmPickBillVo, parameter), pageRequest);
List<MmSporadicPickBill> pickBillList = BeanUtil.copyProperties(page.getContent(), MmSporadicPickBill.class);
final List<MmSporadicPickBill> collectBillList =
pickBillList.stream().filter(e -> e.getDictType() != 3).collect(Collectors.toList());
return buildSuccess(collectBillList);
}
private Specification buildSpecification(MmSporadicPickBillVo mmArriveBillVo, String parameter) {
return new Specification<MmSporadicPickBill>() {
@Override
public Predicate toPredicate(Root<MmSporadicPickBill> root, CriteriaQuery<?> criteriaQuery,
CriteriaBuilder cb) {
List<Predicate> predicates = Lists.newArrayList();
List<Predicate> orlsit = new ArrayList<>();
if (mmArriveBillVo.getDictStatusArr() != null) {
CriteriaBuilder.In<Integer> in = cb.in(root.get("dictStatus").as(Integer.class));
for (Integer status : mmArriveBillVo.getDictStatusArr()) {
in.value(status);
}
predicates.add(in);
}
if (com.cmeim.common.core.utils.StringUtils.isNotEmpty(parameter)) {
orlsit.add(cb.like(root.get(sporadicPickBillNumber).as(String.class), "%" + parameter + "%"));
orlsit.add(cb.like(root.get("orderProdNumber").as(String.class), "%" + parameter + "%"));
}
List<Order> orders = new ArrayList<>();
orders.add(cb.desc(root.get(sporadicPickBillNumber)));
criteriaQuery.orderBy(orders);
// 外联结子表,状态多选->去重
criteriaQuery.distinct(true);
Predicate[] preOr = new Predicate[orlsit.size()];
Predicate[] preAnd = new Predicate[predicates.size()];
if (orlsit.size() == 0) {
//单独使用 and 或者 or 时 返回
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
//组合 and or 时 返回
return criteriaQuery.where(cb.and(predicates.toArray(preAnd)), cb.or(orlsit.toArray(preOr))).getRestriction();
}
};
}
/**
* IF-180:未完成出库单列表接口
*/
@ApiOperation(value = "IF-180:未完成出库单列表接口")
@GetMapping(value = "uncompletedList")
public Respond uncompletedList(PageVo pv, MmSporadicPickBillVo query) {
Integer[] dictStatusArr = {5, 15,20};//,20
query.setDictStatusArr(dictStatusArr);
PageRequest pageRequest = PageRequest.of(pv.getPageNo() - 1, pv.getPageSize(),
Sort.by(sortOrder(pv.getOrders())));
Page page = repository.findAll(buildSpecifications(query), pageRequest);
List<MmSporadicPickBill> list = page.getContent();
List<SporadicPickBillAppVo> voList = new ArrayList<>();
//优化调用接口的逻辑
list.forEach(v -> {
SporadicPickBillAppVo vo = new SporadicPickBillAppVo();
BeanUtils.copyProperties(v, vo);
if (vo.getDictType() != null) {
vo.setDictTypeShow(appService.judge1(vo.getDictType()));
}
vo.setDictStatusShow(appService.judge2(vo.getDictStatus()));
voList.add(vo);
});
pv.setRecordsTotal(page.getTotalElements());
pv.setData(voList);
return buildSuccess(pv);
}
/**
* IF-181:出库单明细接口
*/
@ApiOperation(value = "IF-181:出库单明细接口")
@GetMapping(value = "getDetail")
public Respond getDetail(String sporadicPickBillNumber) {
MmSporadicPickBill sporadicPickBill = repository.findBySporadicPickBillNumber(sporadicPickBillNumber);
List<MmSporadicPickBillDetail> detailList =
detailRepository.findAllBySporadicPickBillNumber(sporadicPickBillNumber);
List<SporadicPickBillDetailVo> voList = BeanUtil.copyProperties(detailList, SporadicPickBillDetailVo.class);
voListAdd(voList,sporadicPickBill);
return buildSuccess(voList);
}
public void voListAdd(List<SporadicPickBillDetailVo> voList,MmSporadicPickBill sporadicPickBill){
voList.forEach(vo -> {
if (vo.getDoneQty().compareTo(vo.getPlanQty()) < 0) {
// 还需要领取的数量
BigDecimal needQty = vo.getPlanQty().subtract(vo.getDoneQty());
List<MmStock> result =
mmStockRepository.findAllByWarehouseCodeAndMaterialCode(sporadicPickBill.getWarehouseCode(),
vo.getMaterialCode());
List<MmStockDto> stockDtoList = BeanUtil.copyProperties(result, MmStockDto.class);
if (stockDtoList.size() != 0) {
List<String> materialBarList = new ArrayList<>();
List<String> locationCodeList = new ArrayList<>();
for (MmStockDto stock : stockDtoList) {
materialBarList.add(stock.getMaterialBar());
locationCodeList.add(stock.getLocationCode());
if (needQty.compareTo(stock.getQty()) > 0) {
needQty = needQty.subtract(stock.getQty());
} else {
break;
}
}
vo.setRecommendBar(String.join(",", materialBarList));
if (locationCodeList.size() > 0) {
// 库位去重
locationCodeList = locationCodeList.stream().distinct().collect(Collectors.toList());
vo.setRecommendLocation(String.join(",", locationCodeList));
}
}
}
// 查询相关领料记录
List<MmSporadicPickBillItem> items =
sporadicPickBillItemRepository.findAllBySporadicPickBillNumberAndMaterialCode(sporadicPickBillNumber, vo.getMaterialCode());
vo.setItems(items);
});
}
/**
* IF-152:app领料单保存
*/
@ApiOperation(value = "IF-152:app领料单保存")
@PostMapping(value = "sporadicPickSave")
public Respond sporadicPickSave(@RequestBody SporadicPickSaveVo vo) {
MmMaterialBar mmMaterialBar = service.sporadicPickSave(vo.getSporadicPickBillNumber(), vo.getMaterialBar(), vo.getQty());
return buildSuccess(mmMaterialBar);
}
/**
* IF-152:app红字领料单保存
*/
@ApiOperation(value = "IF-152:app红字领料单保存")
@PostMapping(value = "sporadicRedPickSave")
public Respond sporadicRedPickSave(@RequestBody SporadicRedPickSaveVo vo) {
service.sporadicRedPickSave(vo);
return buildSuccess("保存成功");
}
/**
* IF-153:app零星出库选择库区
*/
@ApiOperation(value = "IF-153:app零星出库选择库区")
@PostMapping(value = "saveSporadicPickBill")
public Respond saveSporadicPickBill(@RequestBody MmSporadicPickBill mmSporadicPickBill) {
MmSporadicPickBill mmSporadicPickBill1 = BeanUtil.copyProperties(mmSporadicPickBill, MmSporadicPickBill.class);
mmSporadicPickBill1.setUpdatedBy(SecurityUtils.getUsername());
mmSporadicPickBill1.setUpdatedDt(DateUtil.getCurrentDate());
repository.save(mmSporadicPickBill1);
return buildSuccess("库区修改成功");
}
public Specification buildSpecifications(MmSporadicPickBillVo entity) {
String items = "items";
String createdDt = "createdDt";
return (Specification<MmPickBillVo>) (root, criteriaQuery, cb) -> {
List<Predicate> predicates = Lists.newArrayList();
if (StringUtils.isNotBlank(entity.getSporadicPickBillNumber())) {
predicates.add(cb.like(root.get(sporadicPickBillNumber).as(String.class),
"%" + entity.getSporadicPickBillNumber() + "%"));
}
if (entity.getDictStatusArr() != null) {
Path path;
Join join = root.join(items, JoinType.LEFT);
path = join.get("dictStatus");
CriteriaBuilder.In<Integer> in = cb.in(path);
for (Integer status : entity.getDictStatusArr()) {
in.value(status);
}
predicates.add(in);
}
if (StringUtils.isNotBlank(entity.getStartTime())) {
predicates.add(cb.greaterThanOrEqualTo(root.get(createdDt).as(String.class),
entity.getStartTime()));
}
if (StringUtils.isNotBlank(entity.getEndTime())) {
predicates.add(cb.lessThanOrEqualTo(root.get(createdDt).as(String.class), entity.getEndTime()));
}
if (StringUtils.isNotBlank(entity.getCustomerName())) {
predicates.add(cb.like(root.get("customerName").as(String.class),
"%" + entity.getCustomerName() + "%"));
}
if (StringUtils.isNotBlank(entity.getCustomerCode())) {
predicates.add(cb.like(root.get("customerCode").as(String.class), entity.getCustomerCode()));
}
if (StringUtils.isNotBlank(entity.getOrderProdNumber())) {
predicates.add(cb.like(root.get("orderProdNumber").as(String.class), entity.getOrderProdNumber()));
}
if (StringUtils.isNotBlank(entity.getOrderWorkNumber())) {
predicates.add(cb.like(root.get("orderWorkNumber").as(String.class), entity.getOrderWorkNumber()));
}
if (entity.getDictTypeArr() != null) {
CriteriaBuilder.In<Integer> in = cb.in(root.get("dictType").as(Integer.class));
for (Integer status : entity.getDictTypeArr()) {
in.value(status);
}
predicates.add(in);
}
if (entity.getOrderArr() != null) {
CriteriaBuilder.In<String> in = cb.in(root.get(sporadicPickBillNumber).as(String.class));
for (String status : entity.getOrderArr()) {
in.value(status);
}
predicates.add(in);
}
if (StringUtils.isNotBlank(entity.getMaterialCode())) {
Path path;
Join join = root.join(items, JoinType.LEFT);
path = join.get("materialCode");
predicates.add(cb.like(path, "%" + entity.getMaterialCode() + "%"));
}
if (StringUtils.isNotBlank(entity.getMaterialName())) {
Path path;
Join join = root.join(items, JoinType.LEFT);
path = join.get("materialName");
predicates.add(cb.like(path, "%" + entity.getMaterialName() + "%"));
}
if (StringUtils.isNotBlank(entity.getMaterialSpec())) {
Path path;
Join join = root.join(items, JoinType.LEFT);
path = join.get("materialSpec");
predicates.add(cb.like(path, "%" + entity.getMaterialSpec() + "%"));
}
if (StringUtils.isNotBlank(entity.getSourceWarehouseCode())) {
Path path;
Join join = root.join(items, JoinType.LEFT);
path = join.get("sourceWarehouseCode");
predicates.add(cb.equal(path, entity.getSourceWarehouseCode()));
}
if (StringUtils.isNotBlank(entity.getTargetWarehouseCode())) {
Path path;
Join join = root.join(items, JoinType.LEFT);
path = join.get("targetWarehouseCode");
predicates.add(cb.equal(path, entity.getTargetWarehouseCode()));
}
List<Order> orders = new ArrayList<>();
orders.add(cb.desc(root.get(createdDt)));
criteriaQuery.orderBy(orders);
criteriaQuery.distinct(true);
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
}
/**
* 领料亮灯推荐
*/
@ApiOperation(value = "领料亮灯推荐")
@GetMapping(value = "pickLightUp")
public Respond pickLightUp(String pickBillNumber) {
String color = service.pickLightUp(pickBillNumber);
return buildSuccess(color);
}
/**
* 红字货架熄灯
*/
@ApiOperation(value = "红字货架熄灯")
@GetMapping(value = "redOff")
public Respond redOff(String inputBillNumber) {
service.redOff(inputBillNumber);
return buildSuccess();
}
/**
* APP筛选
*/
@ApiOperation(value = "APP筛选")
@PostMapping(value = "findBySporadicPickBillList")
public Respond findBySporadicPickBillList(@RequestBody FndByPickNumberVo vo) {
List<SporadicPickBillDetailVo> voList = service.findBySporadicPickBillList(vo.getPickBillNumber(), vo.getDictStatus(), vo.getMaterialCode());
if (voList.size() > 0) {
return buildSuccess(voList.stream().sorted(
Comparator.comparing(SporadicPickBillDetailVo::getDictStatus)).collect(Collectors.toList()));
}
return buildSuccess(voList);
}
}

View File

@ -0,0 +1,168 @@
package com.cmeim.basic.po;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
import io.swagger.annotations.ApiParam;
@Data
@Entity
@Table(name = "ba_customer")
public class BaCustomer implements Serializable {
/**
* 自增长id
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
@ApiParam(value = "自增长id")
private Long id;
/**
* 客户编号(客户编码)
*/
@Column(name = "customer_code")
@ApiParam(value = "客户编号(客户编码)")
private String customerCode;
/**
* 客户名称(客户名称)
*/
@Column(name = "customer_name")
@ApiParam(value = "客户名称(客户名称)")
private String customerName;
/**
* 客户地址(客户简介)
*/
@Column(name = "customer_address")
@ApiParam(value = "客户地址(客户简介)")
private String customerAddress;
/**
* 联系人
*/
@Column(name = "contacts")
@ApiParam(value = "联系人")
private String contacts;
/**
* 联系方式
*/
@Column(name = "contact_way")
@ApiParam(value = "联系方式")
private String contactWay;
/**
* 创建人
*/
@Column(name = "created_by")
@ApiParam(value = "创建人")
private String createdBy;
/**
* 创建时间
*/
@Column(name = "created_dt")
@ApiParam(value = "创建时间")
private String createdDt;
/**
* 修改人
*/
@Column(name = "updated_by")
@ApiParam(value = "修改人")
private String updatedBy;
/**
* 修改时间
*/
@Column(name = "updated_dt")
@ApiParam(value = "修改时间")
private String updatedDt;
/**
* 编码规则代码
*/
@Column(name = "rule_code")
@ApiParam(value = "编码规则代码")
private String ruleCode;
/**
* 编码规则名称
*/
@Column(name = "rule_name")
@ApiParam(value = "编码规则名称")
private String ruleName;
/**
* 前缀
*/
@Column(name = "prefix")
@ApiParam(value = "前缀")
private String prefix;
/**
* 是否添加订单号
*/
@Column(name = "is_order_prod")
@ApiParam(value = "是否添加订单号")
private Integer isOrderProd;
/**
* 日期格式
*/
@Column(name = "date_form")
@ApiParam(value = "日期格式")
private Integer dateForm;
/**
* 流水号位数值
*/
@Column(name = "length_value")
@ApiParam(value = "流水号位数值")
private Integer lengthValue;
/**
* 后缀
*/
@Column(name = "suffix")
@ApiParam(value = "后缀")
private String suffix;
/**
* 是否添加日期
*/
@Column(name = "is_date")
@ApiParam(value = "是否添加日期")
private Integer isDate;
/**
* 关联仓库代码
*/
@Column(name = "warehouse_code")
@ApiParam(value = "关联仓库代码")
private String warehouseCode;
/**
* 关联仓库名称
*/
@Column(name = "warehouse_name")
@ApiParam(value = "关联仓库名称")
private String warehouseName;
@Column(name = "stock_save_type")
@ApiParam("存货类型")
private Integer stockSaveType;
@Transient
@ApiParam(value = "创建时间集合")
private List<String> createdDtList;
@Transient
@ApiParam(value = "更新时间集合")
private List<String> updatedDtList;
}

View File

@ -0,0 +1,502 @@
<template>
<div class="app-container" style="width: 700px; height: 600px">
<el-form
label-width="120px"
ref="formData"
:model="formData"
:rules="rules"
style="padding-top: 10px; padding-right: 10px"
>
<el-row>
<el-col :span="12">
<el-form-item label="设备名称" prop="deviceName">
<el-input
type="text"
placeholder="请输入设备名称"
v-model="formData.deviceName"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备编号" prop="deviceCode">
<el-input
type="text"
placeholder="请输入设备编号"
v-model="formData.deviceCode"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="规格型号" prop="specificationModel">
<el-input
type="text"
placeholder="请输入规格型号"
v-model="formData.specificationModel"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="使用年限">
<el-input
type="text"
onkeyup="value=value.replace(/[^\d]/g,'')"
placeholder="请输入使用年限"
v-model="formData.serviceLife"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="生产厂家" prop="manufacturer">
<el-input
type="text"
placeholder="请输入生产厂家"
v-model="formData.manufacturer"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="购入时间">
<el-date-picker
v-model="formData.buyTime"
type="datetime"
size="small"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 205px"
placeholder="购入时间"
>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="保养时间">
<el-date-picker
v-model="formData.maintenanceTime"
type="datetime"
size="small"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 205px"
placeholder="保养时间"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="下次保养时间">
<el-date-picker
v-model="formData.nextMaintenanceTime"
type="datetime"
size="small"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 205px"
placeholder="下次保养时间"
>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="状态">
<el-select
style="width: 205px"
v-model="formData.status"
placeholder="状态"
>
<el-option
v-for="item in statusArr"
:key="item.key"
:label="item.value"
:value="item.key"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门名称">
<!-- <el-input
type="text"
placeholder="请输入部门名称"
v-model="formData.deptName"
></el-input>-->
<el-input
v-model="formData.deptName"
class="input_inner"
size="small"
>
<i
slot="suffix"
v-if="true"
class="el-icon-circle-close "
style="margin-right: 10px"
@click.prevent="produceCleanDept"
></i>
<i
slot="suffix"
class="el-icon-search "
@click.prevent="selectDept"
></i>
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="详细信息">
<el-input
type="text"
placeholder="请输入详细信息"
v-model="formData.description"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="折旧年限">
<el-input
type="text"
onkeyup="value=value.replace(/[^\d]/g,'')"
placeholder="请输入折旧年限"
v-model="formData.depreciationPeriod"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="请选择节点" prop="workCenterId">
<Treeselect
placeholder="请选择工作空间"
v-model="formData.workCenterId"
:multiple="false"
:normalizer="normalizer"
:isDefaultExpanded="true"
noResultsText="没有搜索到数据"
:options="treeOptions"
>
</Treeselect>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备类型" prop="dictEquipmentType">
<el-select
v-model="formData.dictEquipmentType"
placeholder="请选择设备类型"
>
<el-option
v-for="(item, index) in this.$dictType.getDict(
'apm_equipment_type'
)"
:key="index"
:label="item.text"
:value="item.key"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-col :span="24">
<el-form-item style="float: right; margin-right: 20px">
<el-button type="primary" @click="save('formData')">确 定</el-button>
<el-button @click="goback">取 消</el-button>
</el-form-item>
</el-col>
</el-form>
</div>
</template>
<script>
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import selectDept from "@/views/mes/warehouse/arriveBill/select-dept";
export default {
name: "edit",
components: { Treeselect },
props: {
layerid: {
type: String,
default: "",
},
lydata: {
type: Object,
default: () => {
return {};
},
},
},
mounted() {
this.ruleFormList();
this.getWorkCenterTree();
if (this.$parent.isAdd == false) {
this.formData = JSON.parse(JSON.stringify(this.lydata));
}
},
data() {
return {
normalizer(node) {
return {
id: node.value,
label: node.title,
children: node.children,
isDefaultExpanded: true,
};
},
ruleForm: {
type: "",
name: "",
value: "",
deviceCode: "",
},
statusArr: [
{ key: 0, value: "在库" },
{ key: 1, value: "在用" },
],
formData: {
deviceCode: undefined,
name: undefined,
specificationModel: undefined,
serviceLife: undefined,
manufacturer: undefined,
buyTime: undefined,
maintenanceTime: undefined,
nextMaintenanceTime: undefined,
status: undefined,
deptName: undefined,
description: undefined,
depreciationPeriod: undefined,
dictEquipmentType: undefined,
},
rules: {
deviceName: [{ required: true, message: "请输入设备名称", trigger: "blur" }],
deviceCode: [
{
required: true,
message: "请输入设备型号",
trigger: "blur",
},
],
specificationModel: [
{ required: true, message: "请输入规格型号", trigger: "blur" },
],
manufacturer: [
{ required: true, message: "请输入生产厂家", trigger: "blur" },
],
},
defaultProps: {
children: "children",
label: "label",
},
treeOptions: [],
options: [],
};
},
methods: {
ruleFormList() {
this.$FactoryModel.getTypetree().then((data) => {
console.log(data);
if (data.data.code === 200) {
this.options = data.data.data[0].children;
}
/* this.ruleForm.type = data.type;
this.ruleForm.name = data.label;*/
});
},
handleChange() {
console.log(this.ruleForm.value);
console.log(this.ruleForm.value[this.ruleForm.value.length - 1]);
},
getparentCode(list) {
if (list === undefined || this.formData.workCenterId === undefined) {
return;
}
list.forEach((value) => {
if (value.value === this.formData.workCenterId) {
this.formData.workCenterName = value.title;
} else {
this.getparentCode(value.children);
}
});
},
save() {
this.getparentCode(this.treeOptions);
if (this.$parent.isAdd) {
this.$refs["formData"].validate((valid) => {
if (valid) {
let params = {
deviceCode: this.formData.deviceCode,
deviceName: this.formData.deviceName,
specificationModel: this.formData.specificationModel,
serviceLife: this.formData.serviceLife,
manufacturer: this.formData.manufacturer,
buyTime: this.formData.buyTime,
maintenanceTime: this.formData.maintenanceTime,
nextMaintenanceTime: this.formData.nextMaintenanceTime,
status: this.formData.status,
deptName: this.formData.deptName,
description: this.formData.description,
depreciationPeriod: this.formData.depreciationPeriod,
workCenterId: this.formData.workCenterId,
workCenterName: this.formData.workCenterName,
dictEquipmentType: this.formData.dictEquipmentType,
};
this.$EquipmentAccount.addEquipment(params).then((resp) => {
if (resp.data.code == 200) {
this.$message.success("添加成功");
this.$parent.getList();
this.$layer.close(this.layerid);
} else {
this.$message.error(resp.data.message);
}
});
} else {
return false;
}
});
} else if (this.$parent.isAdd === false) {
this.$refs["formData"].validate((valid) => {
if (valid) {
let params = {
buyTime: this.formData.buyTime,
depreciationPeriod: this.formData.depreciationPeriod,
deptName: this.formData.deptName,
description: this.formData.description,
deviceCode: this.formData.deviceCode,
isSub: true,
deviceFieldsList: [
{
delFlag: 0,
enterType: 0,
equipmentId: 0,
fieldValue: "string",
id: 0,
name: "string",
propertyGroup: 0,
propertyId: 0,
propertyType: 0,
typeId: 0,
},
],
dna: "string",
id: this.lydata.id,
levelInfo: "string",
maintenanceTime: this.formData.maintenanceTime,
manufacturer: this.formData.manufacturer,
deviceName: this.formData.deviceName,
nextMaintenanceTime: this.formData.nextMaintenanceTime,
oeeId: 0,
orgId: this.formData.orgId,
orgName: "string",
picPath: "string",
serviceLife: this.formData.serviceLife,
specificationModel: this.formData.specificationModel,
status: this.formData.status,
/* tdeviceFields: [
{
delFlag: 0,
enterType: 0,
equipmentId: 0,
fieldValue: "string",
id: 0,
name: "string",
propertyGroup: 0,
propertyId: 0,
propertyType: 0,
typeId: 0,
},
],*/
topicCode: "string",
typeId: 0,
typeName: "string",
};
this.$EquipmentAccount.DpdataEquipment(params).then((resp) => {
if (resp.data.code == 200) {
this.$message.success("修改成功");
this.$parent.getList();
this.$layer.close(this.layerid);
} else {
this.$message.error(resp.data.message);
}
});
} else {
return false;
}
});
}
},
//打开选择部门弹窗
selectDept() {
this.$layer.iframe({
shadeClose: false,
content: {
content: selectDept, //传递的组件对象
parent: this, //当前的vue对象
shadeClose: false
},
title: "选择部门(双击选中单条数据)"
});
},
//选择部门
getDept(row) {
this.formData.deptName = row.deptName;
},
//清空部门
produceCleanDept() {
this.formData.deptName = null;
},
goback() {
this.$layer.close(this.layerid);
},
getWorkCenterTree() {
this.$plan.getWorkCenterTree().then((resp) => {
console.log(resp.data.data, "回家");
this.treeOptions = [];
this.treeOptions.push(resp.data.data);
this.removeBlackChildren(this.treeOptions);
});
},
removeBlackChildren(list) {
list.forEach((value) => {
if (value.children.length == 0) {
value.children = undefined;
} else {
this.removeBlackChildren(value.children);
}
});
},
},
};
</script>
<style lang="scss" scoped>
.el-tree {
top: 8px;
background: grey;
}
.is-current {
background-color: rgb(201, 188, 80) !important;
}
.vue-treeselect--single .vue-treeselect__input-container {
font-size: inherit;
/* height: 100%; */
}
.vue-treeselect--single .vue-treeselect__input {
height: 32px;
}
</style>

View File

@ -0,0 +1,69 @@
package com.cmeim.system.mapper;
import java.util.List;
import com.cmeim.system.domain.SysConfig;
/**
* 参数配置 数据层
*
* @author ruoyi
*/
public interface SysConfigMapper
{
/**
* 查询参数配置信息
*
* @param config 参数配置信息
* @return 参数配置信息
*/
public SysConfig selectConfig(SysConfig config);
/**
* 查询参数配置列表
*
* @param config 参数配置信息
* @return 参数配置集合
*/
public List<SysConfig> selectConfigList(SysConfig config);
/**
* 根据键名查询参数配置信息
*
* @param configKey 参数键名
* @return 参数配置信息
*/
public SysConfig checkConfigKeyUnique(String configKey);
/**
* 新增参数配置
*
* @param config 参数配置信息
* @return 结果
*/
public int insertConfig(SysConfig config);
/**
* 修改参数配置
*
* @param config 参数配置信息
* @return 结果
*/
public int updateConfig(SysConfig config);
/**
* 删除参数配置
*
* @param configId 参数ID
* @return 结果
*/
public int deleteConfigById(Long configId);
/**
* 批量删除参数信息
*
* @param configIds 需要删除的参数ID
* @return 结果
*/
public int deleteConfigByIds(Long[] configIds);
}

View File

@ -0,0 +1,21 @@
package com.cmeim.biz.repository;
import com.cmeim.biz.po.MmProdInBill;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 作者:李俊辉
* date: 2021/9/18
*/
@Repository
public interface MmProdInBillRepository extends JpaRepository<MmProdInBill, Long>, JpaSpecificationExecutor {
List<MmProdInBill> findByOrderWorkNumber(String orderWorkNumber);
MmProdInBill findByProcessInstanceId(String processInstanceId);
MmProdInBill findByProdInBillNumber(String billNumber);
}

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: commons-fileupload:commons-fileupload:1.3.3">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../server/maven/repository/commons-fileupload/commons-fileupload/1.3.3/commons-fileupload-1.3.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../server/maven/repository/commons-fileupload/commons-fileupload/1.3.3/commons-fileupload-1.3.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../server/maven/repository/commons-fileupload/commons-fileupload/1.3.3/commons-fileupload-1.3.3-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,124 @@
module.exports={
tableName:"materialBar",
headerList:[
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 1,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 2,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 3,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 4,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 5,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 6,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 7,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 8,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 9,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 10,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 11,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 12,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 13,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 14,
align:"center",
show_overflow_tooltip:true,
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width:"230",
tableTitleSE: 15,
align:"center",
show_overflow_tooltip:true,
},
]}

View File

@ -0,0 +1,19 @@
package com.cmeim.biz.dto;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import java.io.Serializable;
@Data
public class InputTypeCountDto implements Serializable {
@ApiParam("入库条数")
private Long inputCount;
@ApiParam("其他入库条数")
private Long otherInputCount;
@ApiParam("退库条数")
private Long returnCount;
}

View File

@ -0,0 +1,15 @@
package com.cmeim.biz.repository;
import com.cmeim.biz.po.MmLadingBill;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
/**
* @author 李俊辉
* @version 1.0
* date: 2023/3/9
*/
@Repository
public interface MmLadingBillRepository extends JpaRepository<MmLadingBill, Long>, JpaSpecificationExecutor {
}

View File

@ -0,0 +1,17 @@
package com.cmeim.biz.repository;
import com.cmeim.biz.po.MmPickBillBackItem;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
@Repository
public interface MmPickBillBackItemRepository extends JpaRepository<MmPickBillBackItem, Long>,
JpaSpecificationExecutor {
MmPickBillBackItem findFirstByPickBillNumberAndMaterialCode(String pickBillNumber, String materialCode);
MmPickBillBackItem findFirstByMaterialBarAndDictStatus(String materialBar, Integer dictStatus);
}

View File

@ -0,0 +1,230 @@
package com.cmeim.biz.po;
import com.cmeim.biz.query.annotation.FieldProps;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@Entity
@Table(name = "mm_arrive_bill_detail")
public class MmArriveBillDetailBusiness implements Serializable {
/**
* ID
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@ApiParam(value = "ID")
private Long id;
/**
* 到货单ID
*/
@Column(name = "arrive_bill_id")
@ApiParam(value = "到货单ID")
private Long arriveBillId;
/**
* 到货单号
*/
@Column(name = "arrive_bill_number")
@ApiParam(value = "到货单号")
private String arriveBillNumber;
/**
* 采购订单ID
*/
@Column(name = "purchase_bill_id")
@ApiParam(value = "采购订单ID")
private String purchaseBillId;
/**
* 采购订单号
*/
@Column(name = "purchase_bill_number")
@ApiParam(value = "采购订单号")
private String purchaseBillNumber;
/**
* 采购订单明细ID
*/
@Column(name = "purchase_bill_detail_id")
@ApiParam(value = "采购订单明细ID")
private String purchaseBillDetailId;
/**
* 物料ID
*/
@Column(name = "material_id")
@ApiParam(value = "物料ID")
private Long materialId;
/**
* 物料编码
*/
@FieldProps(value = "物料编码")
@Column(name = "material_code")
@ApiParam(value = "物料编码")
private String materialCode;
/**
* 物料名称
*/
@FieldProps(value = "物料名称")
@Column(name = "material_name")
@ApiParam(value = "物料名称")
private String materialName;
/**
* 规格型号
*/
@FieldProps(value = "规格型号")
@Column(name = "material_spec")
@ApiParam(value = "规格型号")
private String materialSpec;
/**
* 单位
*/
@Column(name = "unit_of_measure")
@ApiParam(value = "单位")
private String unitOfMeasure;
/**
* 单位代码
*/
@Column(name = "unit_of_measure_code")
@ApiParam(value = "单位代码")
private String unitOfMeasureCode;
/**
* 应到数量
*/
@FieldProps(value = "应到数量")
@Column(name = "plan_qty")
@ApiParam(value = "应到数量")
private BigDecimal planQty;
/**
* 实到数量
*/
@FieldProps(value = "实到数量")
@Column(name = "real_qty")
@ApiParam(value = "实到数量")
private BigDecimal realQty;
/**
* 批次号
*/
@Column(name = "batch_no")
@ApiParam(value = "批次号")
private String batchNo;
/**
* 是否检验
*/
@Column(name = "is_inspect")
@ApiParam(value = "是否检验")
private Integer isInspect;
/**
* 备注
*/
@Column(name = "remark")
@ApiParam(value = "备注")
private String remark;
/**
* 状态
*/
@Column(name = "dict_status")
@ApiParam(value = "状态")
private Integer dictStatus;
/**
* 已检验数量
*/
@Column(name = "inspect_qty")
@ApiParam(value = "已检验数量")
private BigDecimal inspectQty;
/**
* 已入库数量
*/
@Column(name = "input_qty")
@ApiParam(value = "已入库数量")
private BigDecimal inputQty;
/**
* 拒收数量
*/
@Column(name = "rejection_qty")
@ApiParam(value = "拒收数量")
private BigDecimal rejectionQty;
/**
* 完成时间
*/
@Column(name = "complete_time")
@ApiParam(value = "完成时间")
private String completeTime;
/**
* ERP同步状态
*/
@Column(name = "dict_erp_status")
@ApiParam(value = "ERP同步状态")
private Integer dictErpStatus;
/**
* ERP同步时间
*/
@Column(name = "erp_sync_time")
@ApiParam(value = "ERP同步时间")
private String erpSyncTime;
/**
* 创建人
*/
@Column(name = "created_by")
@ApiParam(value = "创建人")
private String createdBy;
/**
* 创建时间
*/
@Column(name = "created_dt")
@ApiParam(value = "创建时间")
private String createdDt;
/**
* 修改人
*/
@Column(name = "updated_by")
@ApiParam(value = "修改人")
private String updatedBy;
/**
* 修改时间
*/
@Column(name = "updated_dt")
@ApiParam(value = "修改时间")
private String updatedDt;
/**
* ERP存货类型代码
*/
@Column(name = "erp_material_type_code")
@ApiParam(value = "ERP存货类型代码")
private String erpMaterialTypeCode;
}

View File

@ -0,0 +1,264 @@
<template>
<!-- wms其他入库单打印 -->
<el-container style="margin-top: 10px;" v-loading="loading">
<!-- 添加或修改参数配置对话框 -->
<el-form ref="form" label-width="110px" align="left" style="width: 100%;">
<!-- 主体信息 -->
<el-row
style="display: flex;width: 100%;padding: 10px 10px 10px 10px;flex-wrap: wrap;height: 170px;overflow: auto;"
>
<div v-for="(item, index) in otherInputBills" :key="index" class="cards">
<el-row>到货单号:{{ item.inputBillNumber }}</el-row>
<el-row>部门名称:{{ item.departmentName }}</el-row>
<el-row>仓库名称:{{ item.warehouseName }}</el-row>
<el-row>业务员:{{ item.salesmanName }}</el-row>
</div>
<!--<el-col :span="5.8" v-for="(item,index) in rows" :key="index" class="cards">
</el-col>-->
</el-row>
<!-- 分割线 -->
<el-divider></el-divider>
<!-- 列表 -->
<el-table
style="width: 99%;margin: 0px 0px 0px 5px;"
height="340px"
v-loading="tableLoading"
border
:data="detailList"
highlight-current-row
ref="list"
@selection-change="handleSelectionChange"
>
<el-table-column label="序号" type="index" width="50" align="center" />
<el-table-column type="selection" width="50" />
<el-table-column
label="物料条码"
align="center"
prop="materialBar"
width="320px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="物料编码"
align="center"
prop="materialCode"
width="200px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="物料名称"
align="center"
prop="materialName"
width="260px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="物料规格"
align="center"
prop="materialSpec"
width="210px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="数量"
align="center"
prop="materialQty"
width="150px"
:show-overflow-tooltip="true"
/>
<el-table-column
label="批次号"
align="center"
prop="batchNo"
width="200px"
:show-overflow-tooltip="true"
/>
</el-table>
<!-- 表单按钮 -->
<el-row style="margin-top:20px;">
<el-col :span="24">
<el-form-item style="float: right;margin-right: 20px">
<el-button
type="primary"
@click="submitForm"
v-loading="saveLoading"
>打 印</el-button
>
<el-button @click="cancel">取 消</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div id="printFlow" v-if="printInfo"></div>
</el-container>
</template>
<script>
import QRCode from "qrcodejs2";
export default {
name: "arrive-bill-print",
props: {
layerid: {
type: String,
default: ""
},
rows: {
type: Array,
default: undefined
},
formType: {
type: Number,
default: 0
}
},
data() {
return {
loading: false,
tableLoading: false,
detailList: [],
multipleList: [],
saveLoading: false,
otherInputBills: [],
materialBars: [],
printInfo: false
};
},
created() {
this.initData();
},
methods: {
//初始化
initData() {
var ids = [];
this.rows.forEach(item => {
if (ids.indexOf(item.id) == -1) {
ids.push(item.id);
}
});
this.loading = true;
this.$otherInputBill.getMaterialBar({ ids: ids }).then(res => {
this.loading = false;
this.otherInputBills = res.data.data.otherInputBills;
// this.otherInputBills.map(bill => {
// bill.dictServiceTypeShow = this.$dictType.getDictNameByCodeAndKey(
// "mm_other_input_bill_server_type",
// bill.dictServiceType
// );
// });
this.detailList = res.data.data.materialBars;
});
},
//多选框选中数据
handleSelectionChange(selection) {
this.multipleList = selection;
},
//保存
submitForm() {
let printData = [];
this.printInfo = true;
let router = "";
if (this.multipleList.length > 0) {
printData = this.multipleList;
} else {
printData = this.rows;
}
this.$nextTick(() => {
printData.forEach((value, index) => {
router =
router +
'<div class="a4" style="padding-top: 10px;" >' +
'<table border="1" cellspacing="0" cellpadding="0" style="width:150px;table-layout:fixed;">' +
"<tr>" +
'<td align="center" style="font-size: 9px;height: 25px" width="70px">编码</td>' +
'<td align="center" style="font-size: 9px;width: 160px;word-wrap:break-word;" >' +
value.materialCode +
"</td>" +
'<td align="center" style="font-size: 18px;width: 120px" colspan="2" rowspan="3"><div style="padding-left: 20px" id="qrcode' +
index +
'"></div></td>' +
"</tr>" +
"<tr>" +
'<td align="center" style="font-size: 9px;height:55px;" width="120px">名称</td>' +
'<td align="center" style="font-size: 8px" colspan="1" width="120px"> ' +
value.materialName +
"</td>" +
"</tr>" +
"</tr>" +
"<tr>" +
'<td align="center" style="font-size: 9px;height:25px;" width="120px">条码</td>' +
'<td align="center" style="font-size: 8px" colspan="1" width="120px"> ' +
value.materialBar +
"</td>" +
"</tr>" +
"<tr>" +
'<td align="center" style="font-size: 9px;height: 25px" width="120px">批次</td>' +
'<td align="center" style="font-size: 9px" >' +
value.batchNo +
"</td>" +
'<td align="center" style="font-size: 9px;">数量</td>' +
'<td align="center" style="font-size: 9px;" >' +
value.materialQty +
"</td>" +
"</tr>" +
"</table>" +
" </div>";
});
let printerTable = document.getElementById("printFlow");
printerTable.innerHTML = router;
this.$nextTick(() => {
printData.forEach((value, idx) => {
let qrcode = new QRCode("qrcode" + idx, {
width: 90, //图像宽度
height: 90, //图像高度
colorDark: "#000000", //前景色
colorLight: "#ffffff", //背景色
typeNumber: 4,
correctLevel: QRCode.CorrectLevel.H //容错级别 容错级别有1QRCode.CorrectLevel.L 2QRCode.CorrectLevel.M 3QRCode.CorrectLevel.Q 4QRCode.CorrectLevel.H
});
console.log(value.materialBar);
qrcode.makeCode(value.materialBar);
});
this.$nextTick(() => {
window.setTimeout(() => {
this.loading = false;
this.printInfo = false;
let tableToPrint = document.getElementById("printFlow"); //将要被打印的表格
let newWin = window.open(""); //新打开一个空窗口
newWin.document.write(
"<html><head><title>物料条码打印</title></head><style>@page{margin:0px 10px;size: auto} td{text-align: center; border: solid 1px #000000; height: 20px;}.a4{page-break-before: auto;" +
' page-break-after: always;}</style><body style="padding: 0px;margin: 0px">'
);
newWin.document.write(tableToPrint.outerHTML); //将表格添加进新的窗口
newWin.document.write("</body></html>");
newWin.focus(); //在IE浏览器中使用必须添加这一句
newWin.print(); //打印
newWin.close(); //关闭窗口
}, 1000);
});
});
});
},
//取消
cancel() {
this.$layer.close(this.layerid);
}
}
};
</script>
<style lang="scss" scoped>
>>> .cards {
border: 1px solid black;
border-radius: 5px;
margin-bottom: 10px;
margin: 10px;
background: #e7f6fa;
z-index: 111;
}
</style>

View File

@ -0,0 +1,462 @@
<template>
<div class="app-container">
<div class="main">
<div class="query" ref="query">
<el-form :model="queryParams" ref="queryParams" :inline="true" label-width="100px">
<el-form-item>
<el-input
v-model="queryParams.materialBar"
placeholder="最小包装条码"
clearable
size="small"
style="width: 230px"
/>
</el-form-item>
<el-form-item>
<el-input
v-model="queryParams.boxBar"
placeholder="箱条码"
clearable
size="small"
style="width: 230px;"
/>
</el-form-item>
<el-form-item>
<el-input
v-model="queryParams.materialCode"
placeholder="物料编码"
clearable
size="small"
style="width: 230px;"
/>
</el-form-item>
<el-form-item>
<el-input
v-model="queryParams.materialName"
placeholder="物料名称"
clearable
size="small"
style="width: 230px;"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="Query">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
<el-button
type="primary"
:icon="showMore==true?'el-icon-arrow-up':'el-icon-arrow-down'"
size="mini"
@click="showMoreChange"
></el-button>
</el-form-item>
<div v-show="showMore">
<el-form-item>
<el-input
v-model="queryParams.billNumber"
placeholder="单据编号"
clearable
size="small"
style="width: 230px"
/>
</el-form-item>
<el-form-item>
<el-date-picker
v-model="queryParams.createdDt"
type="datetime"
size="small"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 230px"
placeholder="创建时间开始">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-date-picker
v-model="queryParams.createdDt2"
type="datetime"
size="small"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 230px"
placeholder="创建时间结束">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-select style="width: 230px" collapse-tags v-model="queryParams.warehouseCode" :multiple="true"
placeholder="库区">
<el-option
v-for="item in warehouseOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<div>
<el-form-item>
<el-select style="width: 230px" collapse-tags v-model="queryParams.locationCode" :multiple="true"
placeholder="库位">
<el-option
v-for="item in locationOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input
v-model="queryParams.supplierName"
placeholder="供应商名称"
clearable
size="small"
style="width: 230px"
/>
</el-form-item>
<el-form-item>
<el-input
v-model="queryParams.batchNumber"
placeholder="批次"
clearable
size="small"
style="width: 230px"
/>
</el-form-item>
<el-form-item>
<el-select style="width: 230px" collapse-tags v-model="queryParams.dictFreeze"
placeholder="冻结状态">
<el-option
v-for="item in this.$dictType.getFreezeTypeArray()"
:key="item.key"
:label="item.text"
:value="item.key">
</el-option>
</el-select>
</el-form-item>
</div>
<div>
<el-form-item>
<el-select style="width: 230px" collapse-tags v-model="queryParams.isFil"
placeholder="是否筛选">
<el-option
v-for="item in filOption"
:key="item.key"
:label="item.text"
:value="item.key">
</el-option>
</el-select>
</el-form-item>
</div>
</div>
</el-form>
</div>
<el-divider></el-divider>
<el-row :gutter="10" class="mb8">
<el-popover
style="float: right"
placement="bottom-end"
title="自定义显示列"
width="250"
@show="initPopover"
trigger="hover">
<headConfig ref="test" @fathers="fathers" :propThis="propThis"></headConfig>
<el-button size="mini" type="primary" class="el-icon-caret-bottom" slot="reference">自定义列</el-button>
</el-popover>
</el-row>
<el-table
@header-dragend="headerDragend"
v-loading="loading"
highlight-current-row
@current-change="handleCurrentChange"
:data="tableData"
border
:row-class-name="tableRowClassName"
v-if="indexShow"
:height="tableHeight"
class="tableStyle"
style="width: 100%">
<el-table-column
type="index"
align="center"
label="序号"
width="50">
</el-table-column>
<el-table-column
v-for="(item, index) in realList"
:prop="item.tableProp"
:key="index"
:align="item.align"
header-align="center"
:min-width="item.width"
:label="item.tableTitle"
:show-overflow-tooltip="item.show_overflow_tooltip"
>
</el-table-column>
</el-table>
<el-pagination
style="margin-top: 10px"
@size-change="handleSizeChange"
@current-change="handleCurrentChange2"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100,200,500,1000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div>
</div>
</template>
<script>
export default {
name: 'MaterialExpireTime',
data() {
return{
pageQty:0,
pageQtySummer:0,
indexShow:false,
showMore:false,
currentRow:null,
List:[],
warehouseOptions:[],
locationOptions:[],
realList:[],
isAdd:null,
total:null,
pageSize:50,
buttonEnable:true,
tableHeight:0,
currentPage:1,
propThis:this,
tableData:[],
filOption:[{key:'Y',text:'是'},{key:'N',text:'否'}],
queryParams:{
},
loading:false,
}
},
mounted() {
this.$nextTick(() => {
this.tableHeight = window.innerHeight - this.$refs.query.offsetHeight - 250
})
this.getList()
const params={
tableName:'list'
}
this.$headerConfig.getRealList(params).then(data=>{
console.log("开始输出真正表格")
if(data.data.data!==null){
let temp = JSON.parse(data.data.data)
this.realList = temp.headerList
this.List = temp.List
}else {
this.List = this.$headerConfig.getList("list")
this.realList = this.List
let temp ={
headerList:this.realList,
List:this.List
}
const params={
tableName:"list",
configure:JSON.stringify(temp)
}
this.$headerConfig.updateRealList(params).then(value=>{
console.log(value)
})
}
this.indexShow = true
})
},
methods:{
headerDragend(newWidth, oldWidth, column, event){
// realList
this.realList.forEach(value => {
if (column.property == value.tableProp) {
value.width=newWidth
}
})
this.$refs.test.init();
setTimeout( ()=>{
this.$refs.test.show();
}, 1000);
},
tableRowClassName({row, rowIndex}) {
if(row.bzyxqType===2){
return 'alert'
}
if(row.bzyxqType===1){
return 'warn'
}
if(row.bzyxqType===0){
return 'normal'
}
},
showMoreChange() {
if (!this.showMore) {
this.tableHeight = this.tableHeight - 70
} else {
this.tableHeight = this.tableHeight + 70
}
this.$nextTick(() => {
this.showMore = !this.showMore
})
},
getList() {
this.loading = true
const params = {
pageSize:this.pageSize,
pageNo:this.currentPage,
boxBar:this.queryParams.boxBar,
dictBilltype:this.queryParams.dictBilltype,
dictStatus:this.queryParams.dictStatus,
locationCodes:this.queryParams.locationCode,
materialBar:this.queryParams.materialBar,
materialCode:this.queryParams.materialCode,
materialName:this.queryParams.materialName,
srcBillNumber:this.queryParams.srcBillNumber,
supplierName:this.queryParams.supplierName,
batchNumber:this.queryParams.batchNumber,
warehouseCodes:this.queryParams.warehouseCode,
createdDt:this.queryParams.createdDt,
createdDt2:this.queryParams.createdDt2,
dictFreeze:this.queryParams.dictFreeze,
isFil:this.queryParams.isFil,
}
this.$stock.getListExpireTime(params).then(data=>{
this.tableData = data.data.data.data
this.tableData.forEach(value=>{
value.dictBillTypeShow = this.$dictType.getInputBillType(value.dictBilltype)
value.dictFreezeShow = this.$dictType.getFreezeType(value.dictFreeze)
if(value.isFil==='Y'){
value.filShow = '是'
}else {
value.filShow = '否'
}
console.log(parseInt(value.bzyxq)<30)
if(parseInt(value.bzyxq)<30){
value.bzyxqType = 2
}else if(parseInt(value.bzyxq)<90){
value.bzyxqType = 1
}else{
value.bzyxqType = 0
}
value.bzyxq =value.bzyxq+'天'
})
this.total = data.data.data.recordsTotal
this.loading = false
})
},
initPopover() {
const params={
tableName:'list'
}
this.$headerConfig.getRealList(params).then(data=>{
console.log("开始输出真正表格")
let temp = JSON.parse(data.data.data)
console.log(temp)
this.realList =temp.headerList
console.log(this.realList)
this.$refs.test.init()
})
},
fathers(data) {
this.List = data.configure.List
data.configure.List.forEach(value=>{
this.realList.forEach(real=>{
if (value.tableProp == real.tableProp) {
value.width=real.width;
}
})
})
data.configure.headerList.forEach(value=>{
this.realList.forEach(real=>{
if (value.tableProp == real.tableProp) {
value.width=real.width;
}
})
})
if (data.configure.headerList.length <= 0) {
return;
}
const params={
tableName:"list",
configure:JSON.stringify(data.configure)
}
this.realList = data.configure.headerList;
this.$headerConfig.updateRealList(params).then(value=>{
console.log(value)
})
},
handleCurrentChange2(val) {
// this.currentRow = val;
console.log(val)
this.currentPage = val;
this.getList()
},
handleSizeChange(val){
this.pageSize = val;
this.getList();
},
handleCurrentChange(val){
this.buttonEnable = false
this.currentRow = val;
},
Query() {
this.currentPage = 1
this.getList()
},
resetQuery() {
this.queryParams = {}
},
}
}
</script>
<style scoped>
>>> .el-link.el-link--default {
color: white;
}
>>> .el-form-item {
margin-bottom: 10px;
}
.el-divider {
margin-top: 0px;
margin-bottom: 5px;
}
>>>.el-table .warn {
background: #ffc556;
}
>>>.el-table .normal {
background: #11bc4a;
}
>>>.el-table .alert {
background: #ff5d58;
}
</style>

View File

@ -0,0 +1,239 @@
package com.cmeim.stock.po;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import java.io.Serializable;
@Data
@Entity
@Table(name = "mm_stock_his")
public class MmStockHis implements Serializable {
/**
* Id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@ApiParam(value = "Id")
private Long id;
/**
* 库存Id
*/
@Column(name = "stock_id")
@ApiParam(value = "库存Id")
private Long stockId;
/**
* 最小包装条码
*/
@Column(name = "material_bar")
@ApiParam(value = "最小包装条码")
private String materialBar;
/**
* 箱条码
*/
@Column(name = "box_bar")
@ApiParam(value = "箱条码")
private String boxBar;
/**
* 物料Id
*/
@Column(name = "material_id")
@ApiParam(value = "物料Id")
private Long materialId;
/**
* 物料编码
*/
@Column(name = "material_code")
@ApiParam(value = "物料编码")
private String materialCode;
/**
* 物料名称
*/
@Column(name = "material_name")
@ApiParam(value = "物料名称")
private String materialName;
/**
* 物料规格
*/
@Column(name = "material_spec")
@ApiParam(value = "物料规格")
private String materialSpec;
/**
* 单位
*/
@Column(name = "unit_of_measure")
@ApiParam(value = "单位")
private String unitOfMeasure;
/**
* 批次
*/
@Column(name = "batch_no")
@ApiParam(value = "批次")
private String batchNo;
/**
* 数量
*/
@Column(name = "qty")
@ApiParam(value = "数量")
private java.math.BigDecimal qty;
/**
* 库区Id
*/
@Column(name = "warehouse_id")
@ApiParam(value = "库区Id")
private Long warehouseId;
/**
* 库区代码
*/
@Column(name = "warehouse_code")
@ApiParam(value = "库区代码")
private String warehouseCode;
/**
* 库区名称
*/
@Column(name = "warehouse_name")
@ApiParam(value = "库区名称")
private String warehouseName;
/**
* 库位Id
*/
@Column(name = "location_id")
@ApiParam(value = "库位Id")
private Long locationId;
/**
* 库位代码
*/
@Column(name = "location_code")
@ApiParam(value = "库位代码")
private String locationCode;
/**
* 库位名称
*/
@Column(name = "location_name")
@ApiParam(value = "库位名称")
private String locationName;
/**
* 状态
*/
@Column(name = "dict_status")
@ApiParam(value = "状态")
private Integer dictStatus;
/**
* 单据类型
*/
@Column(name = "dict_billtype")
@ApiParam(value = "单据类型")
private Integer dictBilltype;
/**
* 单据Id
*/
@Column(name = "bill_id")
@ApiParam(value = "单据Id")
private Long billId;
/**
* 单据编号
*/
@Column(name = "bill_number")
@ApiParam(value = "单据编号")
private String billNumber;
/**
* 供应商Id
*/
@Column(name = "supplier_id")
@ApiParam(value = "供应商Id")
private Long supplierId;
/**
* 供应商代码
*/
@Column(name = "supplier_code")
@ApiParam(value = "供应商代码")
private String supplierCode;
/**
* 供应商名称
*/
@Column(name = "supplier_name")
@ApiParam(value = "供应商名称")
private String supplierName;
/**
* 是否筛选
*/
@Column(name = "is_fil")
@ApiParam(value = "是否筛选")
private String isFil;
/**
* 保质期有效期
*/
@Column(name = "bzyxq")
@ApiParam(value = "保质期有效期")
private String bzyxq;
/**
* 创建人
*/
@Column(name = "created_by")
@ApiParam(value = "创建人")
private String createdBy;
/**
* 创建时间
*/
@Column(name = "created_dt")
@ApiParam(value = "创建时间")
private String createdDt;
/**
* 修改人
*/
@Column(name = "updated_by")
@ApiParam(value = "修改人")
private String updatedBy;
/**
* 修改时间
*/
@Column(name = "updated_dt")
@ApiParam(value = "修改时间")
private String updatedDt;
/**
* null
*/
@Column(name = "inspection_no")
@ApiParam(value = "null")
private String inspectionNo;
}

View File

@ -0,0 +1,3 @@
<span ng-if="!property.noValue">{{'PROPERTY.SIGNALDEFINITIONS.DISPLAY' | translate:property.value}}</span>
<span ng-if="property.noValue" translate>PROPERTY.SIGNALDEFINITIONS.EMPTY</span>

View File

@ -0,0 +1,9 @@
define("ace/snippets/abap",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="abap"});
(function() {
window.require(["ace/snippets/abap"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;
}
});
})();

View File

@ -0,0 +1,9 @@
define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-kuroir",t.cssText=".ace-kuroir .ace_gutter {background: #e8e8e8;color: #333;}.ace-kuroir .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-kuroir {background-color: #E8E9E8;color: #363636;}.ace-kuroir .ace_cursor {color: #202020;}.ace-kuroir .ace_marker-layer .ace_selection {background: rgba(245, 170, 0, 0.57);}.ace-kuroir.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #E8E9E8;}.ace-kuroir .ace_marker-layer .ace_step {background: rgb(198, 219, 174);}.ace-kuroir .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(0, 0, 0, 0.29);}.ace-kuroir .ace_marker-layer .ace_active-line {background: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_gutter-active-line {background-color: rgba(203, 220, 47, 0.22);}.ace-kuroir .ace_marker-layer .ace_selected-word {border: 1px solid rgba(245, 170, 0, 0.57);}.ace-kuroir .ace_invisible {color: #BFBFBF}.ace-kuroir .ace_fold {border-color: #363636;}.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;font-style:italic;color:#FD1732;background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)});
(function() {
window.require(["ace/theme/kuroir"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;
}
});
})();

View File

@ -0,0 +1,17 @@
package com.cmeim.biz.vo;
import lombok.Data;
/**
* @ClassName lightVo
* @Description
* @Author LDJ
* @Date 2022/10/12 16:27 星期三
* @Version 1.0
*/
@Data
public class lightVo {
public String shelfCode;
public String lightUpModel;
public String lightColour;
}

View File

@ -0,0 +1,325 @@
/*
* Activiti Modeler component part of the Activiti project
* Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/*
* Task listeners
*/
var KisBpmTaskListenersCtrl = [ '$scope', '$modal', '$timeout', '$translate', function($scope, $modal, $timeout, $translate) {
// Config for the modal window
var opts = {
template: 'editor-app/configuration/properties/task-listeners-popup.html?version=' + Date.now(),
scope: $scope
};
// Open the dialog
$modal(opts);
}];
var KisBpmTaskListenersPopupCtrl = [ '$scope', '$q', '$translate', function($scope, $q, $translate) {
// Put json representing form properties on scope
if ($scope.property.value !== undefined && $scope.property.value !== null
&& $scope.property.value.taskListeners !== undefined
&& $scope.property.value.taskListeners !== null) {
if ($scope.property.value.taskListeners.constructor == String)
{
$scope.taskListeners = JSON.parse($scope.property.value.taskListeners);
}
else
{
// Note that we clone the json object rather then setting it directly,
// this to cope with the fact that the user can click the cancel button and no changes should have happened
$scope.taskListeners = angular.copy($scope.property.value.taskListeners);
}
for (var i = 0; i < $scope.taskListeners.length; i++)
{
var taskListener = $scope.taskListeners[i];
if (taskListener.className !== undefined && taskListener.className !== '')
{
taskListener.implementation = taskListener.className;
}
else if (taskListener.expression !== undefined && taskListener.expression !== '')
{
taskListener.implementation = taskListener.expression;
}
else if (taskListener.delegateExpression !== undefined && taskListener.delegateExpression !== '')
{
taskListener.implementation = taskListener.delegateExpression;
}
}
} else {
$scope.taskListeners = [];
}
// Array to contain selected properties (yes - we only can select one, but ng-grid isn't smart enough)
$scope.selectedListeners = [];
$scope.selectedFields = [];
$scope.translationsRetrieved = false;
$scope.labels = {};
var eventPromise = $translate('PROPERTY.TASKLISTENERS.EVENT');
var implementationPromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.IMPLEMENTATION');
var namePromise = $translate('PROPERTY.TASKLISTENERS.FIELDS.NAME');
$q.all([eventPromise, implementationPromise, namePromise]).then(function(results) {
$scope.labels.eventLabel = results[0];
$scope.labels.implementationLabel = results[1];
$scope.labels.nameLabel = results[2];
$scope.translationsRetrieved = true;
// Config for grid
$scope.gridOptions = {
data: 'taskListeners',
enableRowReordering: true,
headerRowHeight: 28,
multiSelect: false,
keepLastSelected : false,
selectedItems: $scope.selectedListeners,
afterSelectionChange: function (rowItem, event) {
$scope.selectedFields.length = 0;
if ($scope.selectedListeners.length > 0)
{
var fields = $scope.selectedListeners[0].fields;
if (fields !== undefined && fields !== null)
{
for (var i = 0; i < fields.length; i++)
{
var field = fields[i];
if (field.stringValue !== undefined && field.stringValue !== '')
{
field.implementation = field.stringValue;
}
else if (field.expression !== undefined && field.expression !== '')
{
field.implementation = field.expression;
}
else if (field.string !== undefined && field.string !== '')
{
field.implementation = field.string;
}
}
}
}
},
columnDefs: [{ field: 'event', displayName: $scope.labels.eventLabel },
{ field: 'implementation', displayName: $scope.labels.implementationLabel}]
};
// Config for field grid
$scope.gridFieldOptions = {
data: 'selectedListeners[0].fields',
enableRowReordering: true,
headerRowHeight: 28,
multiSelect: false,
keepLastSelected : false,
selectedItems: $scope.selectedFields,
columnDefs: [{ field: 'name', displayName: $scope.labels.name },
{ field: 'implementation', displayName: $scope.labels.implementationLabel}]
};
});
$scope.listenerDetailsChanged = function() {
if ($scope.selectedListeners[0].className !== '')
{
$scope.selectedListeners[0].implementation = $scope.selectedListeners[0].className;
}
else if ($scope.selectedListeners[0].expression !== '')
{
$scope.selectedListeners[0].implementation = $scope.selectedListeners[0].expression;
}
else if ($scope.selectedListeners[0].delegateExpression !== '')
{
$scope.selectedListeners[0].implementation = $scope.selectedListeners[0].delegateExpression;
}
else
{
$scope.selectedListeners[0].implementation = '';
}
};
// Click handler for add button
$scope.addNewListener = function() {
$scope.taskListeners.push({ event : 'create',
implementation : '',
className : '',
expression: '',
delegateExpression: ''});
};
// Click handler for remove button
$scope.removeListener = function() {
if ($scope.selectedListeners.length > 0) {
var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
$scope.gridOptions.selectItem(index, false);
$scope.taskListeners.splice(index, 1);
$scope.selectedListeners.length = 0;
if (index < $scope.taskListeners.length) {
$scope.gridOptions.selectItem(index + 1, true);
} else if ($scope.taskListeners.length > 0) {
$scope.gridOptions.selectItem(index - 1, true);
}
}
};
// Click handler for up button
$scope.moveListenerUp = function() {
if ($scope.selectedListeners.length > 0) {
var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
if (index != 0) { // If it's the first, no moving up of course
// Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
var temp = $scope.taskListeners[index];
$scope.taskListeners.splice(index, 1);
$timeout(function(){
$scope.taskListeners.splice(index + -1, 0, temp);
}, 100);
}
}
};
// Click handler for down button
$scope.moveListenerDown = function() {
if ($scope.selectedListeners.length > 0) {
var index = $scope.taskListeners.indexOf($scope.selectedListeners[0]);
if (index != $scope.taskListeners.length - 1) { // If it's the last element, no moving down of course
// Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
var temp = $scope.taskListeners[index];
$scope.taskListeners.splice(index, 1);
$timeout(function(){
$scope.taskListeners.splice(index + 1, 0, temp);
}, 100);
}
}
};
$scope.fieldDetailsChanged = function() {
if ($scope.selectedFields[0].stringValue != '')
{
$scope.selectedFields[0].implementation = $scope.selectedFields[0].stringValue;
}
else if ($scope.selectedFields[0].expression != '')
{
$scope.selectedFields[0].implementation = $scope.selectedFields[0].expression;
}
else if ($scope.selectedFields[0].string != '')
{
$scope.selectedFields[0].implementation = $scope.selectedFields[0].string;
}
else
{
$scope.selectedFields[0].implementation = '';
}
};
// Click handler for add button
$scope.addNewField = function() {
if ($scope.selectedListeners.length > 0)
{
if ($scope.selectedListeners[0].fields == undefined)
{
$scope.selectedListeners[0].fields = [];
}
$scope.selectedListeners[0].fields.push({ name : 'fieldName',
implementation : '',
stringValue : '',
expression: '',
string: ''});
}
};
// Click handler for remove button
$scope.removeField = function() {
if ($scope.selectedFields.length > 0) {
var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
$scope.gridFieldOptions.selectItem(index, false);
$scope.selectedListeners[0].fields.splice(index, 1);
$scope.selectedFields.length = 0;
if (index < $scope.selectedListeners[0].fields.length) {
$scope.gridFieldOptions.selectItem(index + 1, true);
} else if ($scope.selectedListeners[0].fields.length > 0) {
$scope.gridFieldOptions.selectItem(index - 1, true);
}
}
};
// Click handler for up button
$scope.moveFieldUp = function() {
if ($scope.selectedFields.length > 0) {
var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
if (index != 0) { // If it's the first, no moving up of course
// Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
var temp = $scope.selectedListeners[0].fields[index];
$scope.selectedListeners[0].fields.splice(index, 1);
$timeout(function(){
$scope.selectedListeners[0].fields.splice(index + -1, 0, temp);
}, 100);
}
}
};
// Click handler for down button
$scope.moveFieldDown = function() {
if ($scope.selectedFields.length > 0) {
var index = $scope.selectedListeners[0].fields.indexOf($scope.selectedFields[0]);
if (index != $scope.selectedListeners[0].fields.length - 1) { // If it's the last element, no moving down of course
// Reason for funny way of swapping, see https://github.com/angular-ui/ng-grid/issues/272
var temp = $scope.selectedListeners[0].fields[index];
$scope.selectedListeners[0].fields.splice(index, 1);
$timeout(function(){
$scope.selectedListeners[0].fields.splice(index + 1, 0, temp);
}, 100);
}
}
};
// Click handler for save button
$scope.save = function() {
if ($scope.taskListeners.length > 0) {
$scope.property.value = {};
$scope.property.value.taskListeners = $scope.taskListeners;
} else {
$scope.property.value = null;
}
$scope.updatePropertyInModel($scope.property);
$scope.close();
};
$scope.cancel = function() {
$scope.close();
};
// Close button handler
$scope.close = function() {
$scope.property.mode = 'read';
$scope.$hide();
};
}];

View File

@ -0,0 +1,74 @@
package com.cmeim.biz.po;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
@Data
@Entity
@Table(name = "inte_sidebin_box")
public class InteSidebinBox {
/**
* null
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY, generator = "inte_sidebin_box")
@Column(name = "id")
private Long id;
/**
* 线边仓编号
*/
@Column(name = "sidebin_code")
private String sidebinCode;
/**
* 周转箱条码
*/
@Column(name = "box_bar")
private String boxBar;
/**
* 最小包装条码
*/
@Column(name = "material_bar")
private String materialBar;
/**
* 物料编码
*/
@Column(name = "material_code")
private String materialCode;
/**
* 物料名称
*/
@Column(name = "material_name")
private String materialName;
/**
* 规格型号
*/
@Column(name = "material_spec")
private String materialSpec;
/**
* 条码数量
*/
@Column(name = "qty")
private Integer qty;
/**
* 领料单号
*/
@Column(name = "request_no")
private String requestNo;
}

View File

@ -0,0 +1,86 @@
package com.cmeim.job.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.cmeim.job.domain.SysJobLog;
import com.cmeim.job.mapper.SysJobLogMapper;
/**
* 定时任务调度日志信息 服务层
*
* @author ruoyi
*/
@Service
public class SysJobLogServiceImpl implements ISysJobLogService
{
@Autowired
private SysJobLogMapper jobLogMapper;
/**
* 获取quartz调度器日志的计划任务
*
* @param jobLog 调度日志信息
* @return 调度任务日志集合
*/
@Override
public List<SysJobLog> selectJobLogList(SysJobLog jobLog)
{
return jobLogMapper.selectJobLogList(jobLog);
}
/**
* 通过调度任务日志ID查询调度信息
*
* @param jobLogId 调度任务日志ID
* @return 调度任务日志对象信息
*/
@Override
public SysJobLog selectJobLogById(Long jobLogId)
{
return jobLogMapper.selectJobLogById(jobLogId);
}
/**
* 新增任务日志
*
* @param jobLog 调度日志信息
*/
@Override
public void addJobLog(SysJobLog jobLog)
{
jobLogMapper.insertJobLog(jobLog);
}
/**
* 批量删除调度日志信息
*
* @param logIds 需要删除的数据ID
* @return 结果
*/
@Override
public int deleteJobLogByIds(Long[] logIds)
{
return jobLogMapper.deleteJobLogByIds(logIds);
}
/**
* 删除任务日志
*
* @param jobId 调度日志ID
*/
@Override
public int deleteJobLogById(Long jobId)
{
return jobLogMapper.deleteJobLogById(jobId);
}
/**
* 清空任务日志
*/
@Override
public void cleanJobLog()
{
jobLogMapper.cleanJobLog();
}
}

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1546567861908" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2422" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M318.577778 819.2L17.066667 512l301.511111-307.2 45.511111 45.511111L96.711111 512l267.377778 261.688889zM705.422222 819.2l-45.511111-45.511111L927.288889 512l-267.377778-261.688889 45.511111-45.511111L1006.933333 512zM540.785778 221.866667l55.751111 11.150222L483.157333 802.133333l-55.751111-11.093333z" fill="#bfbfbf" p-id="2423"></path></svg>

After

Width:  |  Height:  |  Size: 732 B

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,20 @@
package com.cmeim.biz.vo;
import com.cmeim.biz.po.MmPickBill;
import com.cmeim.biz.po.MmPickBillDetail;
import io.swagger.annotations.ApiParam;
import lombok.Data;
@Data
public class PickBillVo {
@ApiParam(value = "生产订单Id集合")
private Long[] orderWorkIds;
@ApiParam(value = "领料单")
private MmPickBill bill;
@ApiParam(value = "领料明细")
private MmPickBillDetail[] dtls;
}

View File

@ -0,0 +1,92 @@
package com.cmeim.template.po;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import io.swagger.annotations.ApiParam;
@Data
@Entity
@Table(name = "tp_workcenter_bind")
public class TpWorkcenterBind implements Serializable {
/**
* id记录
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
@ApiParam(value = "id记录")
private Long id;
/**
* 模板ID
*/
@Column(name = "template_id")
@ApiParam(value = "模板ID")
private Long templateId;
/**
* 模板编码
*/
@Column(name = "template_code")
@ApiParam(value = "模板编码")
private String templateCode;
/**
* 模板名称
*/
@Column(name = "template_name")
@ApiParam(value = "模板名称")
private String templateName;
/**
* 工作中心id
*/
@Column(name = "work_center_id")
@ApiParam(value = "工作中心id")
private Long workCenterId;
/**
* 工作中心名称
*/
@Column(name = "work_center_name")
@ApiParam(value = "工作中心名称")
private String workCenterName;
/**
* 删除标记0表示未删除1表示已删除
*/
@Column(name = "deleted")
@ApiParam(value = "删除标记0表示未删除1表示已删除")
private Integer deleted;
/**
* 创建者
*/
@Column(name = "created_by")
@ApiParam(value = "创建者")
private String createdBy;
/**
* 创建时间
*/
@Column(name = "created_dt")
@ApiParam(value = "创建时间")
private String createdDt;
/**
* 修改者
*/
@Column(name = "updated_by")
@ApiParam(value = "修改者")
private String updatedBy;
/**
* 修改时间
*/
@Column(name = "updated_dt")
@ApiParam(value = "修改时间")
private String updatedDt;
}

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apache.avalon.framework:avalon-framework-impl:4.3.1">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/apache/avalon/framework/avalon-framework-impl/4.3.1/avalon-framework-impl-4.3.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/apache/avalon/framework/avalon-framework-impl/4.3.1/avalon-framework-impl-4.3.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/apache/avalon/framework/avalon-framework-impl/4.3.1/avalon-framework-impl-4.3.1-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,620 @@
<template>
<div class="app-container">
<div class="main">
<query-params
ref="query"
:form="queryFormConfig"
@handleQuery="handleQuery"
@getTableData="getTableData"
@resetQuery="resetQuery"
>
</query-params>
<el-divider></el-divider>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="openDetailAdd"
v-hasPermi="['MaterialProperties_add']"
>新增</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
icon="el-icon-plus"
size="mini"
@click="openDetail"
:disabled="buttonEnable"
v-hasPermi="['MaterialProperties_edit']"
>编辑</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
icon="el-icon-plus"
size="mini"
@click="handleDelete"
:disabled="buttonEnable"
v-hasPermi="['MaterialProperties_delete']"
>删除
</el-button>
</el-col>
<el-popover
style="float: right"
placement="bottom-end"
title="自定义显示列"
width="250"
@show="initPopover"
trigger="hover"
>
<headConfig
ref="test"
@fathers="fathers"
:propThis="propThis"
></headConfig>
<el-button
style="margin-right: 5px"
size="mini"
type="primary"
class="el-icon-caret-bottom"
slot="reference"
>自定义列</el-button>
</el-popover>
</el-row>
<el-row
:gutter="10"
style="margin: 10px 0px"
class="mb8"
v-if="isSortShow"
>
<el-col>
<el-select
class="sortSeq"
ref="select"
@click.native="notSelect"
style="width: 100%"
v-model="seqence"
:multiple="true"
placeholder=""
>
<el-option
v-for="item in seqenceOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-col>
</el-row>
<el-table
@sort-change="sortChange"
:row-key="getRowKeys"
@expand-change="rowExpand"
ref="singleTable"
v-loading="loading"
highlight-current-row
@header-dragend="headerDragend"
@current-change="handleCurrentChange"
:data="tableData"
border
lazy
:height="tableHeight"
class="tableStyle"
style="width: 100%"
>
<el-table-column
type="index"
align="center"
label="序号"
width="50"
>
</el-table-column>
<el-table-column type="expand">
<template slot-scope="scope">
<el-table
border
v-loading="loadingChild"
:data="scope.row.childrenList"
>
<el-table-column label="模板编号" prop="templateCode">
</el-table-column>
<el-table-column label="模板名称" prop="templateName">
</el-table-column>
<el-table-column label="自定义属性" prop="attributesName">
</el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column
v-for="(item, index) in realList"
:sortable="item.notSort == true ? false : `custom`"
:prop="item.tableProp"
:key="index"
:align="item.align"
header-align="center"
:min-width="item.width"
:label="item.tableTitle"
:show-overflow-tooltip="item.show_overflow_tooltip"
>
</el-table-column>
</el-table>
<el-pagination
style="margin-top: 10px; height: 20px"
@size-change="handleSizeChange"
@current-change="handleCurrentChange2"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100, 200, 500, 1000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</div>
</div>
</template>
<script>
import edit from "./edit";
export default {
name: "MaterialProperties",
components: {
edit,
},
computed:{
queryFormConfig()
{
return{
controlList:[
{
key:'templateCode',
label:'模板编号',
type:'input',
placeholder:'请输入',
prop:'templateCode',
class:'width_0180'
},
{
key:'templateName',
label:'模板名称',
type:'input',
placeholder:'请输入',
prop:'templateName',
class:'width_0180'
},
],
config:{
//零散的配置参数
hasAdvQuery:true,//有无高级查询
storageMode:true,//记忆模式开启后每次查询会存储到localstorage中存储名为下面的storageKey
storageKey:"MaterialProperties",
propThis:this,//this
preFixWidthClass:'width_0100', //前置框的宽度calss不写则为默认100
marginWidthClass:'width_0180' //空白选择框的宽度calss不写则为默认180
},
defaultList: [
//默认展示的属性,跟controList里面的key相对应
'templateCode','templateName'//'planStartDtArray',
],
}
}
},
data() {
return {
getRowKeys: (row) => {
//获取当前行id
// console.log(row)
return row.id; //这里看这一行中需要根据哪个属性值是id
},
tableHeight: 0,
showMore: false,
currentRow: null,
buttonEnable: true,
realList: [],
isAdd: null,
total: null,
propThis: this,
pageSize: 50,
currentPage: 1,
tableData: [],
queryParams: {},
loading: false,
loadingChild: false,
seqenceOptions: [],
seqence: [],
isSortShow: false,
};
},
mounted() {
let tempList = this.$headerConfig.getList("MaterialProperties");
tempList.forEach((data, index) => {
if (data.notSort) return;
let temp = {
value: null,
label: null,
};
temp.value = data.tableProp.replace("Show", "") + " ascending";
temp.label = data.tableTitle + " 升序";
this.seqenceOptions.push(temp);
let tempD = {
value: null,
label: null,
};
tempD.value = data.tableProp.replace("Show", "") + " descending";
tempD.label = data.tableTitle + " 降序";
this.seqenceOptions.push(tempD);
});
this.$nextTick(() => {
this.tableHeight =
window.innerHeight - this.$refs.query.offsetHeight - 250;
let self = this;
window.onresize = function () {
self.tableHeight =
window.innerHeight - self.$refs.query.offsetHeight - 100;
};
});
this.getAllList();
const params = {
tableName: "MaterialProperties",
};
this.$headerConfig.getRealList(params).then((data) => {
console.log("开始输出真正表格");
if (data.data && data.data.data && data.data.data !== null) {
let temp = JSON.parse(data.data.data);
this.realList = temp.headerList;
this.List = temp.List;
} else {
this.List = this.$headerConfig.getList("MaterialProperties");
this.realList = this.List;
let temp = {
headerList: this.realList,
List: this.List,
};
const params = {
tableName: "MaterialProperties",
configure: JSON.stringify(temp),
};
this.$headerConfig.updateRealList(params).then((value) => {
console.log(value);
});
}
});
this.$refs.query.init()
},
methods: {
headerDragend(newWidth, oldWidth, column, event) {
// realList
this.realList.forEach((value) => {
if (column.property == value.tableProp) {
value.width = newWidth;
}
});
this.$refs.test.init();
setTimeout(() => {
this.$refs.test.show();
}, 1000);
},
notSelect() {
this.$refs.select.blur();
},
sortChange({ column, prop, order }) {
let sTemp = {
value: null,
label: null,
};
let value = prop.replace("Show", "") + " " + order;
let judgeValue = value.split(" ");
// this.seqence.push(value)
if (this.seqence.length === 0) {
this.seqence.push(value);
} else {
for (let i = 0; i < this.seqence.length; i++) {
let judgeSeqence = this.seqence[i].split(" ");
if (judgeValue[0] === judgeSeqence[0]) {
if (judgeValue[1] === "null") {
return;
}
this.seqence.splice(i, 1, value);
return;
}
if (i + 1 === this.seqence.length) {
this.seqence.push(value);
}
}
}
},
rowExpand(row, rowList) {
this.loadingChild = true;
let parmas = {
templateId: row.id,
};
this.$MaterialProperties.getExpandTepleteList(parmas).then((resp) => {
if (resp.data.code === 200) {
row.childrenList = resp.data.data;
this.loadingChild = false;
}
});
},
openDetailAdd() {
this.isAdd = true;
this.$layer.iframe({
shadeClose: false,
content: {
content: edit, //传递的组件对象
parent: this, //当前的vue对象
shadeClose: false,
data: null,
},
title: "新增",
});
},
handleDelete() {
this.$confirm("此操作将永久删除该文件, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
let params = { templateId: this.currentRow.id };
this.$MaterialProperties.deleteThis(params).then((resp) => {
if (resp.data.code == 200) {
this.$message.success("删除成功");
this.getAllList();
} else {
this.$message.error(resp.data.message);
}
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消删除",
});
});
},
openDetail() {
this.isAdd = false;
this.$layer.iframe({
shadeClose: false,
content: {
content: edit, //传递的组件对象
parent: this, //当前的vue对象
shadeClose: false,
data: this.currentRow,
},
title: "修改",
});
},
getQueryParams()
{
let pageSize=this.queryParams.pageSize
let pageNo=this.queryParams.pageNo
this.queryParams=this.$refs.query.getQueryParams()//返回子组件的queryParams
this.queryParams.pageSize=pageSize
this.queryParams.pageNo=pageNo
//取得子组件的queryParams并且与原来的pagesize pageNo合并
},
getTableData(val) {
//高级查询
this.queryData = val
this.tableData=this.queryData.data
this.tableData.forEach((value) => {
value.materialNumber=value.materialCode
value.dictStatusShow = this.$dictType.getOrderWorkStatus(
value.dictStatus
);
value.dictFlowtypeShow = this.$dictType.getMaterialFlowType(
value.dictFlowtype
);
value.dictPtypeShow = this.$dictType.getOrderPtypeType(
value.dictPtype
);
value.dictPstatusShow = this.$dictType.getWorkPStatus(value.dictPstatus);//领料状态
});
this.total=this.queryData.recordsTotal
// this.getBomlList()
},
handleQuery(){
this.getQueryParams()
this.queryParams.pageNo = 1;
this.getAllList();
},
Query() {
this.currentPage = 1;
this.getAllList();
},
resetQuery() {
this.queryParams = {};
this.seqence = [];
this.getAllList();
},
handleSizeChange(val) {
this.pageSize = val;
},
handleCurrentChange2(val) {
this.currentPage = val;
},
handleCurrentChange(val) {
if (val === null) {
this.buttonEnable = true;
} else {
this.buttonEnable = false;
}
this.currentRow = val;
},
initPopover() {
const params = {
tableName: "MaterialProperties",
};
this.$refs.test.init();
},
fathers(data) {
this.List = data.configure.List;
data.configure.List.forEach((value) => {
this.realList.forEach((real) => {
if (value.tableProp == real.tableProp) {
value.width = real.width;
}
});
});
data.configure.headerList.forEach((value) => {
this.realList.forEach((real) => {
if (value.tableProp == real.tableProp) {
value.width = real.width;
}
});
});
if (data.configure.headerList.length <= 0) {
return;
}
const params = {
tableName: "MaterialProperties",
configure: JSON.stringify(data.configure),
};
this.realList = data.configure.headerList;
this.$headerConfig.updateRealList(params).then((value) => {
console.log(value);
});
},
getAllList() {
this.loading = true;
const orders = [];
this.seqence.map((val) => {
orders.push(
val.replace("ascending", "asc").replace("descending", "desc")
);
});
let params = {
pageSize: this.pageSize,
pageNo: this.currentPage,
templateCode: this.queryParams.templateCode,
templateName: this.queryParams.templateName,
attributesName: this.queryParams.attributesName,
orders,
};
this.$MaterialProperties.getExpandList(params).then((resp) => {
if (resp.data.code == 200) {
console.log("拿到数据", resp.data.data);
this.tableData = resp.data.data.data;
this.total = resp.data.data.recordsTotal;
this.loading = false;
}
});
},
},
watch: {
seqence: function () {
this.getAllList();
var oldIsSortShow = this.isSortShow
//判断是否显示排序条件
if(this.seqence.length > 0 ){
this.isSortShow = true
}else{
this.isSortShow = false
}
//判断table高度
if(oldIsSortShow != this.isSortShow){
if (this.isSortShow) {
this.tableHeight = this.tableHeight - 47;
} else {
this.tableHeight = this.tableHeight + 47;
}
}
},
},
};
</script>
<style scoped lang="scss">
.el-table th.gutter {
display: table-cell !important;
}
>>> .el-form-item {
padding: 0px;
margin: 0px;
}
>>> .vue-treeselect__control {
height: 20px;
line-height: 28px;
}
>>> .el-divider {
margin: 1px;
}
>>> .el-table__body tr.current-row > td {
background-color: #8ac1ff !important;
cursor: pointer;
}
.el-table >>> tbody tr:hover > td {
background-color: #8ac1ff !important;
}
.mb8 >>> .el-select .el-input__inner {
border: 0px;
}
.mb8 >>> .el-select .el-input__inner {
border: 0px;
padding-right: 35px;
}
.sortSeq >>> .el-input__suffix-inner {
display: none;
}
>>> .el-form-item {
margin-bottom: 10px;
}
.el-divider {
margin-top: 0px;
margin-bottom: 5px;
}
>>> .el-table .el-table__header-wrapper th {
padding: 5px 0;
}
>>> .vue-treeselect__control {
height: 30px !important;
line-height: 30px !important;
}
>>> .vue-treeselect--single .vue-treeselect__input-container {
height: 30px !important;
line-height: 30px !important;
}
// >>> .el-input-group__append{
// padding: 5px;
// }
>>> .el-input-group__append .el-select,
.el-input-group__append .el-button,
.el-input-group__prepend .el-select,
.el-input-group__prepend .el-button {
margin-left: -28px !important;
margin-right: -33px !important;
}
</style>

View File

@ -0,0 +1,24 @@
package com.cmeim.common.log.enums;
/**
* 操作人类别
*
* @author ruoyi
*/
public enum OperatorType
{
/**
* 其它
*/
OTHER,
/**
* 后台用户
*/
MANAGE,
/**
* 手机端用户
*/
MOBILE
}

View File

@ -0,0 +1,199 @@
<template>
<el-popover
style="float: right"
placement="bottom-end"
width="250"
trigger="hover">
<div>
<el-table
ref="multipleTable"
:data="tableData"
:cell-style="cellStyle"
row-key="tableTitleSE"
tooltip-effect="dark"
style="width: 100%;"
max-height="400"
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
width="55">
</el-table-column>
<el-table-column
prop="tableTitle"
label="自定义显示列"
width="150">
</el-table-column>
<!-- <el-table-column-->
<!-- prop="tableProp"-->
<!-- label="字段"-->
<!-- show-overflow-tooltip>-->
<!-- </el-table-column>-->
</el-table>
<el-button style="margin-top: 10px;" type="primary" size="mini" @click="show">保存配置</el-button>
</div>
<el-button size="mini" type="primary" class="el-icon-caret-bottom" slot="reference">自定义列</el-button>
</el-popover>
</template>
<script>
import Sortable from 'sortablejs'
export default {
name: 'head-config',
props:{
propThis:Object,
layerid: {
type: String,
default: ""
},
},
data() {
return {
tableData:[],
realList:[],
List:[],
}
},
mounted() {
const params={
tableName:this.propThis.tableName
}
this.$headerConfig.getRealList(params).then(data=>{
console.log("定位符而非")
if(data.data.data!==null){
let temp = JSON.parse(data.data.data)
this.realList = temp.headerList
this.List = temp.List
}else {
this.List = this.$headerConfig.getList(this.propThis.tableName)
this.realList = this.List
let temp ={
headerList:this.realList,
List:this.List
}
const params={
tableName:this.propThis.tableName,
configure:JSON.stringify(temp)
}
this.$headerConfig.updateRealList(params).then(value=>{
console.log(value)
})
}
this.propThis.indexShow = true;
const paramsF={
tableName:"bom",
configure:{
headerList:this.realList,
List:this.List
}
}
console.log(paramsF)
this.$emit("fathers", paramsF);
this.tableData = JSON.parse(JSON.stringify(this.List))
this.toggleSelection(JSON.parse(JSON.stringify(this.realList)))
this.dragSort();
})
},
methods:{
init() {
this.tableData = JSON.parse(JSON.stringify(this.List))
this.toggleSelection(JSON.parse(JSON.stringify(this.realList)))
this.dragSort();
},
cellStyle({ row, column, rowIndex, columnIndex }) {
let style = 'padding:6px;padding-top:6px;font-size:15px;'
return style
},
handleSelectionChange(val) {
this.multipleSelection = val
},
dragSort() {
const el = this.$refs.multipleTable.$el.querySelectorAll('.el-table__body-wrapper > table > tbody')[0]
this.sortable = Sortable.create(el, {
ghostClass: 'sortable-ghost',
setData: function(dataTransfer) {
dataTransfer.setData('Text', '')
},
onEnd: e => {
//e.oldIndex为拖动一行原来的位置e.newIndex为拖动后新的位置
const targetRow = this.tableData.splice(e.oldIndex, 1)[0];
this.tableData.splice(e.newIndex, 0, targetRow);
let dragId = this.tableData[e.newIndex].tableTitleSE;//拖动行的id
let oneId, twoId
//拖动行的前一行
if (this.tableData[e.newIndex - 1]) {
oneId = this.tableData[e.newIndex - 1].tableTitleSE;
} else {
oneId = ""
}
//拖动行的后一行
if (this.tableData[e.newIndex + 1]) {
twoId = this.tableData[e.newIndex + 1].tableTitleSE;
} else {
twoId = ""
}
}
})
},
toggleSelection(rows) {
if (rows) {
rows.forEach(row => {
this.tableData.forEach(data=>{
if(data.tableTitleSE ===row.tableTitleSE){
this.$nextTick(function () {
this.$refs.multipleTable.toggleRowSelection(data,true);
})
}
})
});
} else {
this.$refs.multipleTable.clearSelection();
}
},
show() {
console.log("进入罗马")
this.propThis.indexShow=false
let tempData = JSON.parse(JSON.stringify(this.multipleSelection))
// console.log(tempData)
let i =0
this.tableData.forEach(data=>{
data.tableTitleSE = ++i
tempData.forEach(value=>{
if( value.tableProp === data.tableProp){
value.tableTitleSE = data.tableTitleSE
}
})
})
for (let i = 0; i <tempData.length - 1; i++) {
for (let j = 0; j < tempData.length - 1 - i; j++) {
if (tempData[j].tableTitleSE > tempData[j + 1].tableTitleSE) {
let temp = tempData[j];
tempData[j] = tempData[j + 1];
tempData[j + 1] = temp;
}
}
}
const params={
tableName:"bom",
configure:{
headerList:tempData,
List:this.tableData
}
}
// this.propThis.realList = []
this.$emit("fathers", params);
},
}
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,790 @@
<template>
<div class="app-container">
<div class="main">
<query-params
ref="query"
:form="queryFormConfig"
@handleQuery="handleQuery"
@getTableData="getTableData"
@resetQuery="resetQuery"
>
</query-params>
<el-divider></el-divider>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="add"
v-hasPermi="['customer_add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
icon="el-icon-edit"
size="mini"
:disabled="buttonEnable"
@click="handleUpdate"
v-hasPermi="['customer_handleUpdate']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
:disabled="buttonEnable"
@click="handleDelete"
v-hasPermi="['customer_handleDelete']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="info"
icon="el-icon-upload2"
size="mini"
@click="handleImport"
v-hasPermi="['customer_handleImport']"
>导入</el-button>
</el-col>
<el-col v-loading="handleExportLoading" element-loading-spinner="el-icon-loading" :span="1.5">
<el-button
type="warning"
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['customer_handleExport']"
>
导出
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
icon="el-icon-plus"
size="mini"
@click="handleAddSerial"
:disabled="buttonEnable"
v-hasPermi="['customer_addSerial']"
>新增序列号</el-button>
</el-col>
<head-configs
ref="test"
style="margin-right:5px;"
@fathers="fathers"
:propThis="propThis">
</head-configs>
</el-row>
<el-row :gutter="10" style="margin: 10px 0px;" class="mb8" v-if="isSortShow">
<el-col>
<el-select
ref="select"
@click.native="notSelect"
style="width: 100%"
v-model="seqence"
:multiple="true"
placeholder=""
>
<el-option
v-for="item in seqenceOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-col>
</el-row>
<el-table
@sort-change="sortChange"
@header-dragend="headerDragend"
v-if="indexShow"
:row-key="getRowKeys"
v-loading="loading"
highlight-current-row
@current-change="handleCurrentChange"
:data="tableData"
:height="tableHeight"
border
ref="tableDataRef"
class="tableStyle">
<el-table-column
align="center"
type="index"
label="序号"
width="50">
</el-table-column>
<el-table-column
v-for="(item, index) in realList"
:sortable="item.notSort == true ? false : `custom`"
:prop="item.tableProp"
:key="index"
:align="item.align"
header-align="center"
:min-width="item.width"
:label="item.tableTitle"
:show-overflow-tooltip="item.show_overflow_tooltip"
></el-table-column>
</el-table>
<el-pagination
style="margin-top: 10px;height: 20px"
@size-change="handleSizeChange"
@current-change="handleCurrentChange2"
:current-page="queryParams.pageNo"
:page-sizes="[10, 20, 50, 100,200,500,1000]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
<!-- <edit v-if="editNow" ref="edit" :propThis="propThis"></edit>-->
</div>
<!-- 用户导入对话框 -->
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
<el-upload
ref="upload"
:limit="1"
accept=".xlsx, .xls"
:headers="uploadHeaders"
:action="upload.url"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
将文件拖到此处,或
<em>点击上传</em>
</div>
<div class="el-upload__tip" style="color:red" slot="tip">提示仅允许导入“xls”或“xlsx”格式文件</div>
<div class="el-upload__tip" style="color:red" slot="tip">
<el-link type="success" @click.prevent="down">下载模板</el-link>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm">确 定</el-button>
<el-button @click="upload.open = false">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import edit from '@/views/mes/BasicData/customer/edit'
import { getToken } from '@/utils/auth'
import editSerial from './editSerial'
export default {
name: 'customer',
computed: {
queryFormConfig() {
return {
controlList: [
{
key: "customerName",
label: "客户名称",
type: "input",
placeholder: "请输入",
prop: "customerName",
},
{
key: "customerCode",
label: "客户编码",
type: "input",
placeholder: "请输入",
prop: "customerCode",
},
],
config: {
//零散的配置参数
hasAdvQuery: false, //有无高级查询
storageMode:true,//记忆模式开启后每次查询会存储到localstorage中存储名为下面的storageKey
storageKey:"baCustomer",
propThis: this, //this
preFixWidthClass: "width_0100", //前置框的宽度calss不写则为默认100
marginWidthClass: "width_0180", //空白选择框的宽度calss不写则为默认180
},
defaultList: [
//默认展示的属性,跟controList里面的key相对应
"customerName", "customerCode"
],
};
},
},
mounted(){
let tempList = this.$headerConfig.getList("baCustomer");
this.seqenceOptions=[]
tempList.forEach((data, index) => {
if (data.notSort) return;
let temp = {
value: null,
label: null,
};
temp.value = data.tableProp.replace("Show", "") + " ascending";
temp.label = data.tableTitle + " 升序";
this.seqenceOptions.push(temp);
let tempD = {
value: null,
label: null,
};
tempD.value = data.tableProp.replace("Show", "") + " descending";
tempD.label = data.tableTitle + " 降序";
this.seqenceOptions.push(tempD);
});
this.uploadHeaders={'Authorization' : 'Bearer ' + getToken()}
this.$nextTick(() => {
this.tableHeight =
window.innerHeight - this.$refs.query.offsetHeight - 240;
// 监听窗口大小变化
let self = this;
window.onresize = function () {
self.tableHeight =
window.innerHeight - self.$refs.query.offsetHeight - 230;
};
});
this.getCustomerList();
const params = {
tableName: "baCustomer",
};
this.$headerConfig.getRealList(params).then((_data) => {
let data=_data.config?_data.data:_data
console.log(data,'data')
if (data.data !== null) {
let temp = JSON.parse(data.data);
this.realList = temp.headerList;
let withAll = 0;
let lieAll = 0;
this.realList.forEach((data) => {
withAll += parseInt(data.width);
lieAll++;
});
if (withAll <= 1400) {
this.realList.forEach((data) => {
data.width = undefined;
// console.log(data.width)
});
}
this.List = temp.List;
} else {
this.List = this.$headerConfig.getList("baCustomer");
this.realList = this.List;
let temp = {
headerList: this.realList,
List: this.List,
};
const params = {
tableName: "baCustomer",
configure: JSON.stringify(temp),
};
this.$headerConfig.updateRealList(params).then((value) => {
console.log(value)
});
}
this.indexShow = true;
});
this.$refs.query.init()
},
data() {
return {
uploadHeaders:null,
seqence:[],
seqenceOptions: [],
getRowKeys: (row) => {//获取当前行id
// console.log(row)
return row.id //这里看这一行中需要根据哪个属性值是id
},
upload: {
// 是否显示弹出层(用户导入)
open: false,
// 弹出层标题(用户导入)
title: '',
// 是否禁用上传
isUploading: false,
// 是否更新已经存在的用户数据
updateSupport: 0,
// 设置上传的请求头部
// 上传的地址
url:[process.env.VUE_APP_BASE_API]+'/basic/basic/baCustomer/importExcel'
},
currentRow: null,
indexShow: false,
handleExportLoading: false,
realList: [],
fathersStatus:0,
List: [],
propThis: this,
tableName: 'baCustomer',
buttonEnable: true,
editNow: false,
tableHeight: 0,
queryParams: {
customerName: null,
customerCode: null,
status: null,
type: null,
checked: null,
},
childrenList: [],
tableData: [],
loading: false,
isAdd: null,
sonListLoading: false,
pageSize: 50,
pageNo: null,
total: null,
isSortShow: false,
}
},
methods:{
notSelect() {
this.$refs.select.blur();
},
sortChange({ column, prop, order }) {
console.log(prop);
let sTemp = {
value: null,
label: null,
};
let value = prop.replace("Show", "") + " " + order;
let judgeValue = value.split(" ");
// this.seqence.push(value)
if (this.seqence.length === 0) {
this.seqence.push(value);
console.log(this.seqence);
} else {
for (let i = 0; i < this.seqence.length; i++) {
let judgeSeqence = this.seqence[i].split(" ");
if (judgeValue[0] === judgeSeqence[0]) {
if (judgeValue[1] === "null") {
return;
}
this.seqence.splice(i, 1, value);
console.log(this.seqence);
return;
}
if (i + 1 === this.seqence.length) {
this.seqence.push(value);
console.log(this.seqence);
}
}
}
},
headerDragend(newWidth, oldWidth, column, event){
// realList
this.realList.forEach(value => {
if (column.property == value.tableProp) {
value.width=newWidth
}
})
this.$refs.test.init();
setTimeout( ()=>{
this.$refs.test.show();
}, 1000);
},
fathers(data) {
this.List = data.configure.List
data.configure.List.forEach(value=>{
this.realList.forEach(real=>{
if (value.tableProp == real.tableProp) {
value.width=real.width;
}
})
})
data.configure.headerList.forEach(value=>{
this.realList.forEach(real=>{
if (value.tableProp == real.tableProp) {
value.width=real.width;
}
})
})
if (data.configure.headerList.length <= 0) {
return;
}
const params={
tableName:"baCustomer",
configure:JSON.stringify(data.configure)
}
this.realList = data.configure.headerList;
let withAll = 0
let lieAll = 0
this.realList.forEach(data => {
withAll += parseInt(data.width)
lieAll++
})
if (withAll <= 1400) {
this.realList.forEach(data => {
data.width = undefined
})
}
this.$headerConfig.updateRealList(params).then(value=>{
if(this.fathersStatus==0){
this.fathersStatus=1;
}else{
if(value.status=='200'){
this.indexShow=true
// this.$message({
// message: '自定义列宽保存成功',
// type: 'success'
// });
}else{
this.$message({
message: '自定义列宽保存失败',
type: 'error'
});
}
}
})
},
handleCurrentChange2(val) {
console.log(val)
this.pageNo = val;
this.getCustomerList()
},
handleSizeChange(val){
this.pageSize = val;
this.getCustomerList();
},
getQueryParams()
{
let pageSize=this.queryParams.pageSize
let pageNo=this.queryParams.pageNo
this.queryParams=this.$refs.query.getQueryParams()//返回子组件的queryParams
this.queryParams.pageSize=pageSize
this.queryParams.pageNo=pageNo
//取得子组件的queryParams并且与原来的pagesize pageNo合并
},
getTableData(val) {
//高级查询
this.queryData = val
this.tableData=this.queryData.data
this.tableData.forEach((value) => {
value.materialNumber=value.materialCode
value.dictStatusShow = this.$dictType.getOrderWorkStatus(
value.dictStatus
);
value.dictFlowtypeShow = this.$dictType.getMaterialFlowType(
value.dictFlowtype
);
value.dictPtypeShow = this.$dictType.getOrderPtypeType(
value.dictPtype
);
value.dictPstatusShow = this.$dictType.getWorkPStatus(value.dictPstatus);//领料状态
});
this.total=this.queryData.recordsTotal
// this.getBomlList()
},
getCustomerList(){
this.loading = true
const orders = [];
this.seqence.map((val) => {
orders.push(
val.replace("ascending", "asc").replace("descending", "desc")
);
});
const params = {
pageSize:this.pageSize,
pageNo:this.pageNo,
customerName:this.queryParams.customerName,
customerCode:this.queryParams.customerCode,
dictStatus:this.queryParams.status,
dictType:this.queryParams.type,
currentRevision:this.queryParams.checked,
orders:orders,
}
this.$customer.getCustomer(params).then(data=>{
if(data.data.code===200){
this.tableData = data.data.data.data
this.total = data.data.data.recordsTotal
}
this.setCurrent()
this.loading = false
})
},
setCurrent(row) {
if(this.currentRow!==null){
this.tableData.forEach((value,index)=>{
if(this.currentRow.id===value.id){
this.$refs.tableDataRef.setCurrentRow(this.tableData[index]);
}
})
}
},
handleQuery() {
this.getQueryParams()
this.queryParams.pageNo = 1;
this.getCustomerList();
},
resetQuery(){
this.queryParams={};
this.getCustomerList();
},
handleUpdate(row){
this.isAdd = false
// this.$refs.edit.init(row,true)
this.$layer.iframe({
shadeClose: false,
area:['800px','350px'],
content: {
content: edit, //传递的组件对象
parent: this,//当前的vue对象
shadeClose: false,
data:this.currentRow,
},
title: '编辑'
})
},
handleDelete(){
this.$confirm('是否删除?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params={
id:this.currentRow.id
}
this.$customer.deleteCustomer(params).then(data=>{
if(data.data.code===200)
this.$message({
message: '删除成功',
type: 'success'
});
this.getCustomerList();
})
}).catch(() => {
});
},
handleImport(){
this.upload.title = 'Customer导入'
this.upload.open = true
},
down() {
window.location.href = './../down/customer.xlsx'
// 客户信息上传模板
},
// /** 下载模板操作 */
// importTemplate() {
// importTemplate().then(response => {
// this.download(response.msg)
// })
// },
// 文件上传中处理
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true
},
// 文件上传成功处理
handleFileSuccess(response, file, fileList) {
this.upload.open = false
this.upload.isUploading = false
this.$refs.upload.clearFiles()
this.$alert(response.data, '导入结果', { dangerouslyUseHTMLString: true })
this.getCustomerList()
},
// 提交上传文件
submitFileForm() {
this.$refs.upload.submit()
},
handleExport(){
this.handleExportLoading = true
const params={
customerName:this.queryParams.customerName,
// dictStatus:this.queryParams.status,
// dictType:this.queryParams.type,
}
this.$customer.exportExcel(params).then(data=>{
this.handleExportLoading = false
this.download(data.data)
})
},
download(data, fileName) {
// 文件导出
let url = window.URL.createObjectURL(new Blob([data]));
let link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.setAttribute('download', "customer.xlsx");
document.body.appendChild(link);
link.click();
link.remove();
},
handleCurrentChange(val){
this.currentRow = val;
if(val===null){
this.buttonEnable = true
}else {
this.buttonEnable = false
}
},
add() {
let row = null
this.isAdd = true
// this.$refs.edit.init(row,true)
this.$layer.iframe({
shadeClose: false,
area:['800px','350px'],
content: {
content: edit, //传递的组件对象
parent: this,//当前的vue对象
shadeClose: false,
data:row
},
title: '新增'
})
},
handleAddSerial() {
let row = this.currentRow
this.$layer.iframe({
shadeClose: false,
area:['800px','350px'],
content: {
content: editSerial, //传递的组件对象
parent: this,//当前的vue对象
shadeClose: false,
data: row
},
title: '序列号规则'
})
}
},
watch: {
seqence: function () {
this.getCustomerList();
var oldIsSortShow = this.isSortShow
//判断是否显示排序条件
if(this.seqence.length > 0 ){
this.isSortShow = true
}else{
this.isSortShow = false
}
//判断table高度
if(oldIsSortShow != this.isSortShow){
if (this.isSortShow) {
this.tableHeight = this.tableHeight - 47;
} else {
this.tableHeight = this.tableHeight + 47;
}
}
},
},
};
</script>
<style scoped lang="scss">
.el-table th.gutter {
display: table-cell !important;
}
>>> .el-form-item {
padding: 0px;
margin: 0px;
}
>>> .vue-treeselect__control {
height: 20px;
line-height: 28px;
}
>>> .el-divider {
margin: 1px;
}
>>> .el-table__body tr.current-row > td {
background-color: #8ac1ff !important;
cursor: pointer;
}
.el-table >>> tbody tr:hover > td {
background-color: #8ac1ff !important;
}
.mb8 >>> .el-select .el-input__inner {
border: 0px;
}
.mb8 >>> .el-select .el-input__inner {
border: 0px;
padding-right: 35px;
}
.sortSeq >>> .el-input__suffix-inner {
display: none;
}
>>> .el-form-item {
margin-bottom: 10px;
}
.el-divider {
margin-top: 0px;
margin-bottom: 5px;
}
>>> .el-table .el-table__header-wrapper th {
padding: 5px 0;
}
>>> .vue-treeselect__control {
height: 30px !important;
line-height: 30px !important;
}
>>> .vue-treeselect--single .vue-treeselect__input-container {
height: 30px !important;
line-height: 30px !important;
}
// >>> .el-input-group__append{
// padding: 5px;
// }
>>> .el-input-group__append .el-select,
.el-input-group__append .el-button,
.el-input-group__prepend .el-select,
.el-input-group__prepend .el-button {
margin-left: -28px !important;
margin-right: -33px !important;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

View File

@ -0,0 +1,4 @@
<!-- Just need to instantiate the controller, and it will take care of showing the modal dialog -->
<span ng-controller="KisBpmFieldsCtrl">
</span>

View File

@ -0,0 +1,400 @@
<template>
<!-- 选择产品信息 -->
<div class="app-container">
<el-form
:model="queryParams"
ref="queryForm"
:inline="true"
label-width="68px"
>
<el-form-item label="物料编码">
<el-input
v-model="queryParams.materialCode"
placeholder="物料编码"
clearable
size="small"
style="width: 130px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="产品名称">
<el-input
v-model="queryParams.materialName"
placeholder="产品名称"
clearable
size="small"
style="width: 130px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="规格型号">
<el-input
v-model="queryParams.materialSpec"
placeholder="规格型号"
clearable
size="small"
style="width: 130px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="物料类型">
<el-input
v-model="queryParams.materialTypeName"
placeholder="物料类型"
@keyup.enter.native="handleQuery"
clearable
size="small"
style="margin-bottom: 1px; width: 12.81rem !important"
>
<el-button
slot="append"
icon="el-icon-search"
@click="selectMaterialType"
></el-button>
</el-input>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
lazy
@row-click="singleClick"
border
:expand-row-keys="expands"
:row-key="getRowKeys"
@expand-change="rowExpand"
:data="materialList"
@row-dblclick="handleDbClick"
ref="list"
height="400px"
>
<el-table-column type="expand">
<template slot-scope="scope">
<el-table
@row-dblclick="handleDbClick"
style="width: 95%"
class="two-list"
v-loading="subLoading"
:data="childrenList"
>
<el-table-column
label="替代物料编码"
align="center"
width="auto"
prop="alternateCode"
:show-overflow-tooltip="true"
/>
<el-table-column
label="替代物料名称"
align="center"
width="auto"
prop="alternateName"
:show-overflow-tooltip="true"
/>
<!-- <el-table-column
label="替代规格型号"
align="center"
width="250"
prop="materialSpec"
:show-overflow-tooltip="true"
/> -->
<el-table-column
label="物料类型代码"
align="center"
prop="materialTypeCode"
width="auto"
:show-overflow-tooltip="true"
/>
<el-table-column
label="物料类型名称"
align="center"
prop="materialTypeName"
width="auto"
:show-overflow-tooltip="true"
/>
<!-- <el-table-column
label="批次数量"
align="center"
width="250"
prop="lotSize"
:show-overflow-tooltip="true"
/> -->
<!-- <el-table-column
label="BOM"
align="center"
prop="bomName"
width="120"
:show-overflow-tooltip="true"
/> -->
<!-- <el-table-column
label="工艺路线"
align="center"
prop="routeName"
width="120"
:show-overflow-tooltip="true"
/> -->
</el-table>
</template>
</el-table-column>
<el-table-column v-if="bomFirst"
label="BOM"
align="center"
prop="bomName"
width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
label="物料编码"
align="center"
width="250"
prop="materialCode"
:show-overflow-tooltip="true"
/>
<el-table-column
label="物料名称"
align="center"
width="250"
prop="materialName"
:show-overflow-tooltip="true"
/>
<el-table-column
label="规格型号"
align="center"
prop="materialSpec"
:show-overflow-tooltip="true"
/>
<!-- <el-table-column-->
<!-- label="物料类型代码"-->
<!-- align="center"-->
<!-- prop="materialTypeCode"-->
<!-- width="230"-->
<!-- :show-overflow-tooltip="true"-->
<!-- />-->
<el-table-column
label="物料类型名称"
align="center"
prop="materialTypeName"
width="230"
:show-overflow-tooltip="true"
/>
<!--
<el-table-column
label="批次数量"
align="center"
width="250"
prop="lotSize"
:show-overflow-tooltip="true"
/>
<el-table-column v-if="!bomFirst"
label="BOM"
align="center"
prop="bomName"
width="120"
:show-overflow-tooltip="true"
/>
<el-table-column
label="工艺路线"
align="center"
prop="routeName"
width="120"
:show-overflow-tooltip="true"
/> -->
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- <order-prod-form :propThis="propsThis" ref="orderForm"></order-prod-form>-->
</div>
</template>
<script>
import selectMaterialTypeTemp from "./../../../BasicData/materiel/selectMaterialType";
export default {
name: "orderProd",
props: {
layerid: {
type: String,
default: "",
},
lydata: {
default: () => {
return {};
},
},
bomFirst:{
//是否把BOM放在第一个字段
type:Boolean,
default: () => {
return false;
},
}
},
data() {
return {
subLoading: false,
childrenList: [],
expands: [], //只展开一行放入当前行id
getRowKeys: (row) => {
//获取当前行id
// console.log(row)
return row.id; //这里看这一行中需要根据哪个属性值是id
},
loading: false,
total: 0,
materialList: [],
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 50,
materialCode: null,
code: undefined,
name: undefined,
},
};
},
watch: {},
mounted() {
console.log(this.bomFirst,'0923')
if (this.lydata.length > 0) {
console.log(this.lydata[this.lydata.length - 1]);
this.queryParams.materialCode =
this.lydata[this.lydata.length - 1].materialCode;
}
this.initData();
},
methods: {
selectMaterialType() {
this.$layer.iframe({
shadeClose: false,
content: {
content: selectMaterialTypeTemp, //传递的组件对象
parent: this, //当前的vue对象
shadeClose: false,
},
area: [this.g_const.dialogWidthMiddle, "600px"],
title: "选择物料类型",
});
},
getSelectMType(row) {
this.$set(this.queryParams, "materialTypeName", row.materialTypeName);
this.$set(this.queryParams, "materialTypeId", row.id);
this.$set(this.queryParams, "materialTypeCode", row.materialTypeCode);
},
rowExpand(row, rowList) {
this.$refs.list.setCurrentRow(row);
this.childrenList = [];
this.subLoading = true;
let that = this;
console.log("进入", rowList.length);
if (rowList.length) {
that.expands = [];
if (row) {
that.expands.push(row.id);
}
this.getChildrenList(row.materialId || row.id);
} else {
that.expands = [];
}
},
getChildrenList(id) {
this.$materiel
.getMaterialAlternateList({ materialId: id })
.then((_data) => {
let data = _data.config ? _data.data : _data;
console.log("s数据", data);
this.childrenList = data.data;
console.log("点击的数据", this.childrenList);
this.subLoading = false;
});
},
//初始化表格
initData() {
// this.getList();
this.getListInBom()
},
handleDbClick(row, event, column) {
if (this.$parent && this.$parent.getSelectMaterial) {
this.$parent.getSelectMaterial(row);
this.$layer.close(this.layerid);
} //如果是vue-layer
else {
this.$emit("getSelectMaterial", row);
} //如果是el-dialog对话框
},
/** 查询bom表中的替代料 */
async getListInBom() {
console.log(this.lydata.materialId, '查询bom表中的替代料')
// this.lydata.materialId = 49743
if (this.lydata.materialId) {
const res = await this.$plan.selectMaterialNumberInboom({ materialId: this.lydata.materialId })
const data = res.data.data
console.log(data, 'bom表中的替代料')
this.total = data.length
this.materialList = data
}
},
/** 查询订单列表 */
getList() {
this.loading = false;
this.$plan.selectMaterialNumber(this.queryParams).then((_data) => {
let resp = _data.config ? _data.data : _data;
console.log(resp, "order-prod-select-material getlist");
this.total = resp.data.recordsTotal;
this.materialList = resp.data.data;
});
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNo = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.dateRange = [];
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.rows = selection;
this.single = selection.length != 1;
this.multiple = !selection.length;
},
singleClick(val) {
console.log("vvvv", val);
},
},
};
</script>
<style scoped lang="scss">
>>> .el-table {
width: 1050px;
}
</style>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apache.httpcomponents:httpcore-nio:4.4.14">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/apache/httpcomponents/httpcore-nio/4.4.14/httpcore-nio-4.4.14.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/apache/httpcomponents/httpcore-nio/4.4.14/httpcore-nio-4.4.14-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/apache/httpcomponents/httpcore-nio/4.4.14/httpcore-nio-4.4.14-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,9 @@
define("ace/snippets/autohotkey",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="autohotkey"});
(function() {
window.require(["ace/snippets/autohotkey"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;
}
});
})();

View File

@ -0,0 +1,290 @@
module.exports = {
tableName: "pickBill",
headerList: [{
tableTitle: "领料单号",
tableProp: "pickBillNumber",
width: "150",
tableTitleSE: 1,
align: "center",
show_overflow_tooltip: true,
},
{
tableTitle: "工单编号",
tableProp: "orderWorkNumbers",
width: "150",
tableTitleSE: 2,
align: "center",
show_overflow_tooltip: true,
},
{
tableTitle: "订单编号",
tableProp: "orderProdNumbers",
width: "150",
tableTitleSE: 3,
align: "center",
show_overflow_tooltip: true,
},
{
tableTitle: "物料编码",
tableProp: "code",
width: "150",
tableTitleSE: 30,
align: "center",
show_overflow_tooltip: true,
},
{
tableTitle: "物料名称",
tableProp: "name",
width: "150",
tableTitleSE: 31,
align: "center",
show_overflow_tooltip: true,
},
{
tableTitle: "物料规格",
tableProp: "spec",
width: "150",
tableTitleSE: 32,
align: "center",
show_overflow_tooltip: true,
},
{
tableTitle: "类型",
tableProp: "dictTypeShow",
width: "80",
tableTitleSE: 4,
align: "center",
show_overflow_tooltip: true,
},
{
tableTitle: "状态",
tableProp: "dictStatusShow",
width: "80",
tableTitleSE: 5,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "物料编码",
tableProp: "materialCode",
width: "150",
tableTitleSE: 6,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "物料名称",
tableProp: "materialName",
width: "200",
tableTitleSE: 7,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "规格型号",
tableProp: "materialSpec",
width: "200",
tableTitleSE: 8,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "物料单位",
tableProp: "materialUnit",
width: "100",
tableTitleSE: 9,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "单台用量",
tableProp: "assemblyQty",
width: "100",
tableTitleSE: 10,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "计划数量",
tableProp: "planQty",
width: "100",
tableTitleSE: 11,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "实领数量",
tableProp: "doneQty",
width: "100",
tableTitleSE: 12,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "实退数量",
tableProp: "returnQty",
width: "100",
tableTitleSE: 13,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "实补数量",
tableProp: "replenishQty",
width: "100",
tableTitleSE: 14,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "源库区代码",
tableProp: "sourceWarehouseCode",
width: "150",
tableTitleSE: 15,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "源库区名称",
tableProp: "sourceWarehouseName",
width: "200",
tableTitleSE: 16,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "目标库区代码",
tableProp: "targetWarehouseCode",
width: "150",
tableTitleSE: 17,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "目标库区名称",
tableProp: "targetWarehouseName",
width: "200",
tableTitleSE: 18,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "ERP对应单据号",
tableProp: "erpNumber",
width: "200",
tableTitleSE: 19,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "ERP同步状态",
tableProp: "dictErpStatusShow",
width: "150",
tableTitleSE: 20,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "ERP同步时间",
tableProp: "erpSyncTime",
width: "170",
tableTitleSE: 21,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "备注",
tableProp: "memo",
width: "170",
tableTitleSE: 43,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "溯源需求",
tableProp: "requirement",
width: "170",
tableTitleSE: 44,
align: "center",
show_overflow_tooltip: true,
notSort: true,
isItem: true
},
{
tableTitle: "创建人",
width: "130",
show_overflow_tooltip: true,
align: "center",
tableProp: "createdBy",
tableTitleSE: 22,
notSort: true,
isItem: true
},
{
tableTitle: "创建时间",
width: "170",
show_overflow_tooltip: true,
align: "center",
tableProp: "createdDt",
tableTitleSE: 23,
notSort: true,
isItem: true
},
{
tableTitle: "修改人",
width: "130",
show_overflow_tooltip: true,
align: "center",
tableProp: "updatedBy",
tableTitleSE: 24,
notSort: true,
isItem: true
},
{
tableTitle: "修改时间",
width: "170",
show_overflow_tooltip: true,
align: "center",
tableProp: "updatedDt",
tableTitleSE: 25,
notSort: true,
isItem: true
},
]
}

View File

@ -0,0 +1,555 @@
package com.cmeim.system.service.impl;
import java.util.ArrayList;
import java.util.List;
import com.cmeim.system.api.domain.SysUserRole;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.cmeim.common.core.constant.UserConstants;
import com.cmeim.common.core.exception.CustomException;
import com.cmeim.common.core.utils.SecurityUtils;
import com.cmeim.common.core.utils.StringUtils;
import com.cmeim.common.datascope.annotation.DataScope;
import com.cmeim.system.api.domain.SysRole;
import com.cmeim.system.api.domain.SysUser;
import com.cmeim.system.domain.SysPost;
import com.cmeim.system.domain.SysUserPost;
import com.cmeim.system.mapper.SysPostMapper;
import com.cmeim.system.mapper.SysRoleMapper;
import com.cmeim.system.mapper.SysUserMapper;
import com.cmeim.system.mapper.SysUserPostMapper;
import com.cmeim.system.mapper.SysUserRoleMapper;
import com.cmeim.system.service.ISysConfigService;
import com.cmeim.system.service.ISysUserService;
/**
* 用户 业务层处理
*
* @author ruoyi
*/
@Service
public class SysUserServiceImpl implements ISysUserService
{
private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
@Autowired
private SysUserMapper userMapper;
@Autowired
private SysRoleMapper roleMapper;
@Autowired
private SysPostMapper postMapper;
@Autowired
private SysUserRoleMapper userRoleMapper;
@Autowired
private SysUserPostMapper userPostMapper;
@Autowired
private ISysConfigService configService;
/**
* 根据条件分页查询用户列表
*
* @param user 用户信息
* @return 用户信息集合信息
*/
@Override
@DataScope(deptAlias = "d", userAlias = "u")
public List<SysUser> selectUserList(SysUser user)
{
return userMapper.selectUserList(user);
}
@Override
public List<SysUser> specialList(String specialCode)
{
return userMapper.specialList(specialCode);
}
/**
* 通过用户名查询用户
*
* @param userName 用户名
* @return 用户对象信息
*/
@Override
public SysUser selectUserByUserName(String userName)
{
return userMapper.selectUserByUserName(userName);
}
/**
* 通过用户昵称查询用户
*
* @param nickName 用户昵称
* @return 用户对象信息
*/
@Override
public SysUser selectUserByNickName(String nickName)
{
return userMapper.selectUserByNickName(nickName);
}
/**
* 通过用户ID查询用户
*
* @param userId 用户ID
* @return 用户对象信息
*/
@Override
public SysUser selectUserById(Long userId)
{
return userMapper.selectUserById(userId);
}
@Override
public List<SysUser> selectUserByIdIn(ArrayList<Long> userId) {
return userMapper.selectUserByIdIn(userId);
}
@Override
public List<SysUserRole> findUserByRoleId(Long roleId) {
return userRoleMapper.findUserByRoleId(roleId);
}
/**
* 查询用户所属角色组
*
* @param userName 用户名
* @return 结果
*/
@Override
public String selectUserRoleGroup(String userName)
{
List<SysRole> list = roleMapper.selectRolesByUserName(userName);
StringBuffer idsStr = new StringBuffer();
for (SysRole role : list)
{
idsStr.append(role.getRoleName()).append(",");
}
if (StringUtils.isNotEmpty(idsStr.toString()))
{
return idsStr.substring(0, idsStr.length() - 1);
}
return idsStr.toString();
}
/**
* 查询用户所属岗位组
*
* @param userName 用户名
* @return 结果
*/
@Override
public String selectUserPostGroup(String userName)
{
List<SysPost> list = postMapper.selectPostsByUserName(userName);
StringBuffer idsStr = new StringBuffer();
for (SysPost post : list)
{
idsStr.append(post.getPostName()).append(",");
}
if (StringUtils.isNotEmpty(idsStr.toString()))
{
return idsStr.substring(0, idsStr.length() - 1);
}
return idsStr.toString();
}
/**
* 校验用户名称是否唯一
*
* @param userName 用户名称
* @return 结果
*/
@Override
public String checkUserNameUnique(String userName)
{
int count = userMapper.checkUserNameUnique(userName);
if (count > 0)
{
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 校验用户名称是否唯一
*
* @param user 用户信息
* @return
*/
@Override
public String checkPhoneUnique(SysUser user)
{
Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
{
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 校验email是否唯一
*
* @param user 用户信息
* @return
*/
@Override
public String checkEmailUnique(SysUser user)
{
Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
SysUser info = userMapper.checkEmailUnique(user.getEmail());
if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
{
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 校验用户是否允许操作
*
* @param user 用户信息
*/
@Override
public void checkUserAllowed(SysUser user)
{
if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
{
throw new CustomException("不允许操作超级管理员用户");
}
}
/**
* 新增保存用户信息
*
* @param user 用户信息
* @return 结果
*/
@Override
@Transactional
public int insertUser(SysUser user)
{
// 新增用户信息
int rows = userMapper.insertUser(user);
// 新增用户岗位关联
insertUserPost(user);
// 新增用户与角色管理
insertUserRole(user);
return rows;
}
/**
* 新增保存用户角色关联
*
* @param userId 用户id
* @param roleId 角色id
* @return 结果
*/
@Override
@Transactional
public int insertUserRole(Long roleId , Long userId)
{
// 新增用户信息
int rows = userMapper.insertUserRole(roleId , userId);
return rows;
}
/**
* 修改保存用户信息
*
* @param user 用户信息
* @return 结果
*/
@Override
@Transactional
public int updateUser(SysUser user)
{
Long userId = user.getUserId();
// 删除用户与角色关联
userRoleMapper.deleteUserRoleByUserId(userId);
// 新增用户与角色管理
insertUserRole(user);
// 删除用户与岗位关联
userPostMapper.deleteUserPostByUserId(userId);
// 新增用户与岗位管理
insertUserPost(user);
return userMapper.updateUser(user);
}
/**
* 修改保存用户cid
*
* @param userId,cid
* @return 结果
*/
@Override
@Transactional
public int updateCid(Long userId, String cid)
{
return userMapper.updateCid(userId, cid);
}
/**
* 修改用户状态
*
* @param user 用户信息
* @return 结果
*/
@Override
public int updateUserStatus(SysUser user)
{
return userMapper.updateUser(user);
}
/**
* 修改用户基本信息
*
* @param user 用户信息
* @return 结果
*/
@Override
public int updateUserProfile(SysUser user)
{
return userMapper.updateUser(user);
}
/**
* 修改用户头像
*
* @param userName 用户名
* @param avatar 头像地址
* @return 结果
*/
@Override
public boolean updateUserAvatar(String userName, String avatar)
{
return userMapper.updateUserAvatar(userName, avatar) > 0;
}
/**
* 重置用户密码
*
* @param user 用户信息
* @return 结果
*/
@Override
public int resetPwd(SysUser user)
{
return userMapper.updateUser(user);
}
/**
* 重置用户密码
*
* @param userName 用户名
* @param password 密码
* @return 结果
*/
@Override
public int resetUserPwd(String userName, String password)
{
return userMapper.resetUserPwd(userName, password);
}
/**
* 新增用户角色信息
*
* @param user 用户对象
*/
public void insertUserRole(SysUser user)
{
Long[] roles = user.getRoleIds();
if (StringUtils.isNotNull(roles))
{
// 新增用户与角色管理
List<SysUserRole> list = new ArrayList<SysUserRole>();
for (Long roleId : roles)
{
SysUserRole ur = new SysUserRole();
ur.setUserId(user.getUserId());
ur.setRoleId(roleId);
list.add(ur);
}
if (list.size() > 0)
{
userRoleMapper.batchUserRole(list);
}
}
}
/**
* 新增用户岗位信息
*
* @param user 用户对象
*/
public void insertUserPost(SysUser user)
{
Long[] posts = user.getPostIds();
if (StringUtils.isNotNull(posts))
{
// 新增用户与岗位管理
List<SysUserPost> list = new ArrayList<SysUserPost>();
for (Long postId : posts)
{
SysUserPost up = new SysUserPost();
up.setUserId(user.getUserId());
up.setPostId(postId);
list.add(up);
}
if (list.size() > 0)
{
userPostMapper.batchUserPost(list);
}
}
}
/**
* 通过用户ID删除用户
*
* @param userId 用户ID
* @return 结果
*/
@Override
@Transactional
public int deleteUserById(Long userId)
{
// 删除用户与角色关联
userRoleMapper.deleteUserRoleByUserId(userId);
// 删除用户与岗位表
userPostMapper.deleteUserPostByUserId(userId);
return userMapper.deleteUserById(userId);
}
/**
* 通过用户ID删除用户角色关联表
*
* @param userId 用户ID
* @return 结果
*/
@Override
@Transactional
public int deleteUserRoleById(Long userId)
{
// 删除用户与角色关联
return userRoleMapper.deleteUserRoleByUserId(userId);
}
/**
* 通过用户ID删除用户角色关联表
*
* @param userId 用户ID
* @return 结果
*/
@Override
@Transactional
public int deleteUserRole(Long userId,Long roleId)
{
// 删除用户与角色关联
return userRoleMapper.deleteUserRoleByRoleAndUser(userId,roleId);
}
/**
* 批量删除用户信息
*
* @param userIds 需要删除的用户ID
* @return 结果
*/
@Override
@Transactional
public int deleteUserByIds(Long[] userIds)
{
for (Long userId : userIds)
{
checkUserAllowed(new SysUser(userId));
}
// 删除用户与角色关联
userRoleMapper.deleteUserRole(userIds);
// 删除用户与岗位关联
userPostMapper.deleteUserPost(userIds);
return userMapper.deleteUserByIds(userIds);
}
/**
* 导入用户数据
*
* @param userList 用户数据列表
* @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
* @param operName 操作用户
* @return 结果
*/
@Override
public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)
{
if (StringUtils.isNull(userList) || userList.size() == 0)
{
throw new CustomException("导入用户数据不能为空!");
}
int successNum = 0;
int failureNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
String password = configService.selectConfigByKey("sys.user.initPassword");
for (SysUser user : userList)
{
try
{
// 验证是否存在这个用户
SysUser u = userMapper.selectUserByUserName(user.getUserName());
if (StringUtils.isNull(u))
{
user.setPassword(SecurityUtils.encryptPassword(password));
user.setCreateBy(operName);
this.insertUser(user);
successNum++;
successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 导入成功");
}
else if (isUpdateSupport)
{
user.setUpdateBy(operName);
this.updateUser(user);
successNum++;
successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 更新成功");
}
else
{
failureNum++;
failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 已存在");
}
}
catch (Exception e)
{
failureNum++;
String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";
failureMsg.append(msg + e.getMessage());
log.error(msg, e);
}
}
if (failureNum > 0)
{
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new CustomException(failureMsg.toString());
}
else
{
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
}
@Override
public List<SysUser> selectUserByUserNameIn(ArrayList<String> userName) {
return userMapper.selectUserByUserNameIn(userName);
}
}

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/org/jboss/logging/jboss-logging/3.4.1.Final/jboss-logging-3.4.1.Final-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,41 @@
package com.cmeim.biz.query.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldProps {
/**
* 隐藏
*
* @return
*/
boolean hide() default false;
/**
* 属性名
*
* @return
*/
String value() default "";
/**
* 类型
* string 字符串
* date 日期
* list 集合
*
* @return
*/
FieldType type() default FieldType.STRING;
/**
* 业务字段分组编码在type=FieldType.DICT时生效
*/
String dictCode() default "";
}

View File

@ -0,0 +1,40 @@
查询窗体添加步骤:
<query-params
ref="query"
:form="queryFormConfig"
@handleQuery="handleQuery"
@getTableData="getTableData"
@resetQuery="resetQuery"
>
</query-params>
首先删掉原来的查询窗体的部分
queryFormConfig为查询窗体配置写在计算属性中,通过控制queryFormConfig的值来控制要显示的属性列表controlList和默认值(defaultList),详见每一行后的注释 D:\micro202201171617MONDAY\src\views\tool\example\index.vue
然后添加函数 getQueryParams()
{
let pageSize=this.queryParams.pageSize
let pageNo=this.queryParams.pageNo
this.queryParams=this.$refs.query.getQueryParams()//返回子组件的queryParams
this.queryParams.pageSize=pageSize
this.queryParams.pageNo=pageNo
//取得子组件的queryParams并且与原来的pagesize pageNo合并
},
在handleQuery里面加上一行 this.getQueryParams()//加上这一句
在mounted最后一行 加入 this.$refs.query.init()
事件:
1.
FAQ
1.解决查询条件首次加载的刷新问题:
queryFormConfig里写 key:this.key//解决查询条件首次加载的刷新问题
vue的data里面写key:0,//解决查询条件首次加载的刷新问题
然后this.key++ //解决查询条件首次加载的刷新问题
2.change事件:在<query-params 后加入 @xxxChange=“xxxChange” xxx为对应的prop名
3.强制刷新this.key++;
this.$nextTick(()=>{this.$refs.query.refresh();})
4.记忆模式在config中有两个参数storageMode:true, storageKey用于记忆模式(//storageMode:true,//记忆模式开启后每次查询会存储到localstorage中存储名为storageKey)

View File

@ -0,0 +1,228 @@
<template>
<!-- wms到货单查看入库单 -->
<el-container style="margin-top: 10px;" v-loading="loading">
<!-- 添加或修改参数配置对话框 -->
<el-form ref="form" :model="form" label-width="120px" :rules="rules" align="left" style="width: 100%;">
<!-- 第一行 -->
<el-row>
<el-col :span="6">
<el-form-item label="入库单号" prop="">
<el-input size="mini" disabled v-model="form.inputBillNumber"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="送货单号" prop="">
<el-input size="mini" disabled v-model="form.arriveBillNumber"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="检验单号" prop="">
<el-input size="mini" disabled v-model="form.inspectBillNumber"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="仓库名称" prop="">
<el-input size="mini" disabled v-model="form.warehouseName"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 第二行 -->
<el-row>
<el-col :span="6">
<el-form-item label="供应商名称" prop="">
<el-input size="mini" disabled v-model="form.supplierName"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="部门名称" prop="">
<el-input size="mini" disabled v-model="form.departmentName"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="客户名称" prop="">
<el-input size="mini" disabled v-model="form.customerName"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="状态" prop="">
<el-input size="mini" disabled v-model="form.dictStatusShow"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 第三行 -->
<el-row>
<el-col :span="6">
<el-form-item label="类型" prop="">
<el-input size="mini" disabled v-model="form.dictTypeShow"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="到货备注" prop="">
<el-input size="mini" disabled v-model="form.remark"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="ERP同步单据号" prop="">
<el-input size="mini" disabled v-model="form.erpNumber"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="ERP同步状态" prop="">
<el-input size="mini" disabled v-model="form.dictErpStatusShow"></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 第四行 -->
<el-row style="margin-bottom:-24px">
<el-col :span="6">
<el-form-item label="审核人" prop="">
<el-input size="mini" disabled ></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="审核时间" prop="">
<el-input size="mini" disabled ></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 分割线 -->
<el-divider></el-divider>
<!-- 列表头部按钮 -->
<el-row :gutter="10" style="width:99%;margin-left:0px">
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-plus" size="mini">打印</el-button>
</el-col>
</el-row>
<!-- 列表 -->
<el-table style="width: 99%;margin: 10px 0px 0px 5px;" height="320" border
v-loading="tableLoading" :data="detailList" ref="list">
<el-table-column align="center" type="index" label="序号" width="50"/>
<el-table-column type="selection" width="50"/>
<el-table-column label="物料编码" align="center" prop="materialCode" width="100px" :show-overflow-tooltip="true"/>
<el-table-column label="物料名称" align="center" prop="materialName" width="200px" :show-overflow-tooltip="true"/>
<el-table-column label="物料规格" align="center" prop="materialSpec" width="200px" :show-overflow-tooltip="true"/>
<el-table-column label="批次" align="center" prop="batchNo" width="150px" :show-overflow-tooltip="true"/>
<el-table-column label="状态" align="center" prop="dictStatusShow" width="150px" :show-overflow-tooltip="true"/>
<el-table-column label="完成时间" align="center" prop="completeTime" width="150px" :show-overflow-tooltip="true"/>
<el-table-column label="计划收货数量" align="center" prop="planQty" width="150px" :show-overflow-tooltip="true"/>
<el-table-column label="实际收货数量" align="center" prop="realQty" width="150px" :show-overflow-tooltip="true"/>
<el-table-column label="库区名称" align="center" prop="locationName" width="150px" :show-overflow-tooltip="true"/>
<el-table-column label="备注" align="center" prop="remark" width="150px" :show-overflow-tooltip="true"/>
</el-table>
<!-- 表单按钮 -->
<el-row style="margin-top:20px">
<el-col :span="24">
<el-form-item style="float: right;margin-right: 20px">
<el-button type="primary" @click="submitForm" v-loading="saveLoading">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-container>
</template>
<script>
export default {
components: {
},
props: {
layerid: {
type: String,
default: ''
},
row: {
type: Object,
default: undefined
},
formType: {
type: Number,
default: 0
}
},
data() {
return {
loading: false,
form: {
},
rules: {},
tableLoading: false,
detailList: [],
saveLoading: false,
}
},
async mounted() {
},
created() {
console.log(this.row)
this.initData()
},
methods: {
//初始化
initData(){
this.loading = true
this.$inspectBill.queryInputBillByInspectBillNumber(this.row.inspectBillNumberCopy).then(res=>{
this.form = res.data.data
this.form.dictStatusShow = this.$dictType.getDictNameByCodeAndKey(
"mm_inspect_bill_status",
this.form.dictStatus
);
this.form.dictTypeShow = this.$dictType.getDictNameByCodeAndKey(
"mm_inspect_bill_type",
this.form.dictType
);
this.form.dictErpStatusShow = this.$dictType.getDictNameByCodeAndKey(
"mm_inspect_bill_statusERP",
this.form.dictErpStatus
);
this.detailList = res.data.data.items
this.detailList.forEach(item=>{
item.dictStatusShow = this.$dictType.getDictNameByCodeAndKey(
"mm_inspect_bill_status",
item.dictStatus
);
})
this.loading = false
})
},
//保存按钮
submitForm(){
this.cancel()
},
//取消按钮
cancel(){
//this.reset()
this.$layer.close(this.layerid)
},
// 重置表单
// reset(){
// this.form = {
// }
// },
}
}
</script>
<style lang="scss" scoped>
.el-form-item {
margin-bottom: 10px;
}
>>>.el-table__body tr.current-row>td {
background-color: #8ac1ff !important;
cursor: pointer;
}
.el-table>>>tbody tr:hover>td {
background-color: #8ac1ff !important;
}
.input_inner /deep/ .el-input__inner {
background-color: white !important;
}
</style>

View File

@ -0,0 +1,30 @@
package com.cmeim;
import com.cmeim.common.security.annotation.EnableCustomConfig;
import com.cmeim.common.security.annotation.EnableRyFeignClients;
import com.cmeim.common.swagger.annotation.EnableCustomSwagger2;
import org.activiti.spring.boot.SecurityAutoConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.SpringCloudApplication;
/**
* 基础模块
*
* @author ruoyi
*/
@EnableCustomConfig
@EnableCustomSwagger2
@EnableRyFeignClients
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
@SpringCloudApplication
@MapperScan("com.cmeim.basic.mapper")
public class CmeImBasicApplication
{
public static void main(String[] args)
{
SpringApplication.run(CmeImBasicApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ 基础模块启动成功 ლ(´ڡ`ლ)゙");
}
}

View File

@ -0,0 +1,9 @@
define("ace/snippets/latex",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="latex"});
(function() {
window.require(["ace/snippets/latex"], function(m) {
if (typeof module == "object" && typeof exports == "object" && module) {
module.exports = m;
}
});
})();

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

View File

@ -0,0 +1,67 @@
package com.cmeim.template.controller;
import com.cmeim.template.po.TpFormBind;
import com.cmeim.template.service.TpFormBindService;
import com.cmeim.common.core.utils.DateUtil;
import com.cmeim.common.core.web.controller.GenericController;
import com.cmeim.common.core.web.domain.Respond;
import com.cmeim.common.core.web.domain.TUserInfo;
import com.cmeim.common.core.web.page.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 模板配置
*
* @author ggf
*/
@Api(value = "formBind")
@RestController
@RequestMapping("template/formBind")
public class TpFormBindController extends GenericController {
@Autowired
TpFormBindService tpFormBindService;
@ApiOperation(value = "新增表单绑定")
@PostMapping(value = "add")
public Respond add(TpFormBind tpFormBind){
TUserInfo userInfo = getCurrentUser();
tpFormBind.setCreatedBy(userInfo.getUserName());
tpFormBind.setCreatedDt(DateUtil.getCurrentDate());
tpFormBindService.save(tpFormBind);
return buildSuccess();
}
@ApiOperation(value = "删除表单绑定")
@PostMapping(value = "delete")
public Respond delete(TpFormBind tpFormBind){
tpFormBindService.delete(tpFormBind);
return buildSuccess();
}
@ApiOperation(value = "修改表单绑定")
@PutMapping(value = "update")
public Respond update(TpFormBind tpFormBind){
TUserInfo userInfo = getCurrentUser();
tpFormBind.setUpdatedBy(userInfo.getUserName());
tpFormBind.setUpdatedDt(DateUtil.getCurrentDate());
tpFormBindService.save(tpFormBind);
return buildSuccess();
}
@ApiOperation(value = "获取绑定信息")
@GetMapping(value = "list")
public Respond list(PageVo pv, TpFormBind tpFormBind) {
tpFormBindService.list(pv,tpFormBind,sortOrder(pv.getOrders()));
return buildSuccess(pv);
}
@ApiOperation(value = "获取绑定信息全部")
@GetMapping(value = "listAll")
public Respond listAll(TpFormBind tpFormBind) {
return buildSuccess(tpFormBindService.listAll(tpFormBind));
}
}

View File

@ -0,0 +1,84 @@
// cover some element-ui styles
.el-breadcrumb__inner,
.el-breadcrumb__inner a {
font-weight: 400 !important;
}
.el-upload {
input[type="file"] {
display: none !important;
}
}
.el-upload__input {
display: none;
}
.cell {
.el-tag {
margin-right: 0px;
}
}
.small-padding {
.cell {
padding-left: 5px;
padding-right: 5px;
}
}
.fixed-width {
.el-button--mini {
padding: 7px 10px;
width: 60px;
}
}
.status-col {
.cell {
padding: 0 10px;
text-align: center;
.el-tag {
margin-right: 0px;
}
}
}
// to fixed https://github.com/ElemeFE/element/issues/2461
.el-dialog {
transform: none;
left: 0;
position: relative;
margin: 0 auto;
}
// refine element ui upload
.upload-container {
.el-upload {
width: 100%;
.el-upload-dragger {
width: 100%;
height: 200px;
}
}
}
// dropdown
.el-dropdown-menu {
a {
display: block
}
}
// fix date-picker ui bug in filter-item
.el-range-editor.el-input__inner {
display: inline-flex !important;
}
// to fix el-date-picker css style
.el-range-separator {
box-sizing: content-box;
}

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1579774825624" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1248" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M498.595712 482.290351 345.420077 482.290351l0 57.307194 210.477712 0L555.897789 274.196942l-57.301054 0L498.596735 482.290351zM498.595712 482.290351" p-id="1249"></path><path d="M577.685002 644.98478l379.879913 0 0 57.302077L577.685002 702.286858 577.685002 644.98478 577.685002 644.98478zM577.685002 644.98478" p-id="1250"></path><path d="M577.685002 773.764795l379.879913 0 0 57.307194L577.685002 831.071989 577.685002 773.764795 577.685002 773.764795zM577.685002 773.764795" p-id="1251"></path><path d="M577.685002 902.549927l379.879913 0 0 57.307194L577.685002 959.857121 577.685002 902.549927 577.685002 902.549927zM577.685002 902.549927" p-id="1252"></path><path d="M102.523001 382.290823c4.450359 2.615571 9.470699 3.954055 14.530948 3.954055 2.969635 0 5.952572-0.461511 8.836249-1.394766l190.809767-61.886489c15.052834-4.882194 23.297612-21.040199 18.415418-36.08894-4.882194-15.052834-21.040199-23.297612-36.093033-18.415418L175.676092 308.458257c15.994276-26.115797 35.170011-50.537 57.370639-72.743768 73.767074-73.767074 171.845857-114.388237 276.16783-114.388237 104.32095 0 202.39564 40.622186 276.16169 114.388237s114.393353 171.845857 114.393353 276.16783c0 26.427906-2.615571 52.449559-7.709589 77.780481l58.302871 0c4.464685-25.499767 6.708795-51.470255 6.708795-77.780481 0-60.449767-11.845793-119.102608-35.204803-174.336584-22.559808-53.334719-54.850236-101.226472-95.968725-142.349055-41.122583-41.122583-89.017406-73.408917-142.348032-95.968725C628.317169 75.866898 569.659211 64.021106 509.215584 64.021106c-60.448744 0-119.106702 11.845793-174.336584 35.207873-53.334719 22.559808-101.230566 54.846142-142.349055 95.968725-23.980157 23.980157-44.934398 50.278103-62.727647 78.601172l-20.738323-105.655342c-3.043313-15.527648-18.105357-25.642007-33.631982-22.599717-15.527648 3.048429-25.64303 18.105357-22.599717 33.637098l36.102243 183.932126C90.51348 371.153158 95.460142 378.13313 102.523001 382.290823L102.523001 382.290823zM102.523001 382.290823" p-id="1253"></path><path d="M126.020158 587.9416 67.768453 587.9416c5.759167 33.679054 15.368012 66.544579 28.789697 98.278327 22.559808 53.333696 54.850236 101.225449 95.971795 142.348032 41.122583 41.122583 89.014336 73.408917 142.349055 95.968725 54.112432 22.88829 111.517863 34.71157 170.668031 35.18229L505.547031 902.395408c-102.94972-0.941442-199.594851-41.445948-272.499277-114.349351C177.545672 732.543975 140.810003 663.275355 126.020158 587.9416L126.020158 587.9416zM126.020158 587.9416" p-id="1254"></path></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: jakarta.transaction:jakarta.transaction-api:1.3.3">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../server/maven/repository/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../server/maven/repository/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../server/maven/repository/jakarta/transaction/jakarta.transaction-api/1.3.3/jakarta.transaction-api-1.3.3-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,110 @@
module.exports= {
tableName: "pickBillList",
headerList: [
{
tableTitle: "领料单号",
width:"200",
show_overflow_tooltip:true,
align:"center",
tableProp: "pickBillNumber",
tableTitleSE: 1,
},
{
tableTitle: "工单编号集合",
width:"200",
show_overflow_tooltip:true,
align:"center",
tableProp: "orderWorkNumbers",
tableTitleSE: 2
},
{
tableTitle: "工单Id集合",
width:"200",
tableProp: "orderWorkIds",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 3
},
{
tableTitle: "状态",
width:"100",
tableProp: "dictStatusShow",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 4
},
{
tableTitle: "类型",
width:"100",
tableProp: "dictTypeShow",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 5
},
{
tableTitle: "ERP同步状态",
width:"200",
tableProp: "dictErpStatus",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 6
},
{
tableTitle: "ERP同步时间",
width:"200",
tableProp: "erpSyncTime",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 7
},
{
tableTitle: "图片确认状态",
width:"200",
tableProp: "pictureConfirm",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 8
},
{
tableTitle: "内部检验号",
width:"200",
tableProp: "zinin",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 9
},
{
tableTitle: "创建人",
width:"100",
tableProp: "createdBy",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 10
},
{
tableTitle: "创建时间",
width:"200",
tableProp: "createdDt",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 11
},
{
tableTitle: "更新人",
width:"100",
tableProp: "updatedBy",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 12
},
{
tableTitle: "更新时间",
width:"200",
tableProp: "updatedDt",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 13
},
]}

View File

@ -0,0 +1,185 @@
package com.cmeim.stock.po;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import io.swagger.annotations.ApiParam;
@Data
@Entity
@Table(name = "order_info")
public class OrderInfo implements Serializable {
/**
* null
*/
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
@ApiParam(value = "null")
private Long id;
/**
* 生产任务单
*/
@Column(name = "production_task")
@ApiParam(value = "生产任务单")
private String productionTask;
/**
* 单据状态(5-已录入、10-部分入库、15-全部入库)
*/
@Column(name = "order_status")
@ApiParam(value = "单据状态(5-已录入、10-部分入库、15-全部入库)")
private Integer orderStatus;
/**
* 销售订单
*/
@Column(name = "sale_order")
@ApiParam(value = "销售订单")
private String saleOrder;
/**
* 物料编码
*/
@Column(name = "material_code")
@ApiParam(value = "物料编码")
private String materialCode;
/**
* 物料名称
*/
@Column(name = "material_name")
@ApiParam(value = "物料名称")
private String materialName;
/**
* 物料规格
*/
@Column(name = "material_spec")
@ApiParam(value = "物料规格")
private String materialSpec;
/**
* 计划完工日期
*/
@Column(name = "planned_completion_date")
@ApiParam(value = "计划完工日期")
private String plannedCompletionDate;
/**
* 计划数量
*/
@Column(name = "plan_qty")
@ApiParam(value = "计划数量")
private Integer planQty;
/**
* 已入库数
*/
@Column(name = "in_qty")
@ApiParam(value = "已入库数")
private Integer inQty;
/**
* 入库中数量
*/
@Column(name = "ongoing_qty")
@ApiParam(value = "入库中数量")
private Integer ongoingQty;
/**
* 出库数量
*/
@Column(name = "out_qty")
@ApiParam(value = "出库数量")
private Integer outQty;
/**
* 待校验数
*/
@Column(name = "wait_check_qty")
@ApiParam(value = "待校验数")
private Integer waitCheckQty;
/**
* 已校验数
*/
@Column(name = "finish_check_qty")
@ApiParam(value = "已校验数")
private Integer finishCheckQty;
/**
* 校验中数
*/
@Column(name = "check_qty")
@ApiParam(value = "校验中数")
private Integer checkQty;
/**
* 创建人
*/
@Column(name = "created_by")
@ApiParam(value = "创建人")
private String createdBy;
/**
* 创建时间
*/
@Column(name = "created_dt")
@ApiParam(value = "创建时间")
private String createdDt;
/**
* 更新人
*/
@Column(name = "updated_by")
@ApiParam(value = "更新人")
private String updatedBy;
/**
* 更新时间
*/
@Column(name = "updated_dt")
@ApiParam(value = "更新时间")
private String updatedDt;
/**
* 成品区已入库数
*/
@Column(name = "product_in_qty")
@ApiParam(value = "成品区已入库数")
private Integer productInQty;
/**
* 成品区入库中数量
*/
@Column(name = "product_ongoing_qty")
@ApiParam(value = "成品区入库中数量")
private Integer productOngoingQty;
/**
* 成品区出库数量
*/
@Column(name = "product_out_qty")
@ApiParam(value = "成品区出库数量")
private Integer productOutQty;
@Transient
@ApiParam(value = "计划完工日期-开始")
private String plannedCompletionDateStart;
@Transient
@ApiParam(value = "计划完工日期-结束")
private String plannedCompletionDateEnd;
@Transient
@ApiParam("单据状态集合")
private Integer[] orderStatusArr;
@Transient
@ApiParam("排序")
private String[] orders;
}

View File

@ -0,0 +1,3 @@
<span ng-if="!property.noValue">{{'PROPERTY.FIELDS' | translate:property.value.fields}}</span>
<span ng-if="property.noValue">{{'PROPERTY.FIELDS.EMPTY' | translate}}</span>

View File

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.netflix.ribbon:ribbon-transport:2.3.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/com/netflix/ribbon/ribbon-transport/2.3.0/ribbon-transport-2.3.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/com/netflix/ribbon/ribbon-transport/2.3.0/ribbon-transport-2.3.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$PROJECT_DIR$/../../../server/maven/repository/com/netflix/ribbon/ribbon-transport/2.3.0/ribbon-transport-2.3.0-sources.jar!/" />
</SOURCES>
</library>
</component>

View File

@ -0,0 +1,144 @@
module.exports= {
tableName: "stockCaution",
headerList: [
{
tableTitle: "物料编码",
width:"230",
show_overflow_tooltip:true,
align:"center",
tableProp: "materialCode",
HeaderType:'normal',
tableTitleSE: 1
},
{
tableTitle: "物料名称",
width:"230",
show_overflow_tooltip:true,
align:"center",
tableProp: "materialName",
HeaderType:'normal',
tableTitleSE: 2
},
{
tableTitle: "目标库区代码",
width:"230",
show_overflow_tooltip:true,
align:"center",
tableProp: "warehouseCode",
HeaderType:'normal',
tableTitleSE: 3
},
{
tableTitle: "目标库区名称",
width:"230",
show_overflow_tooltip:true,
align:"center",
tableProp: "warehouseName",
HeaderType:'normal',
tableTitleSE: 4
},
{
tableTitle: "安全库存",
width:"100",
show_overflow_tooltip:true,
align:"center",
tableProp: "cautionQty",
HeaderType:'normal',
tableTitleSE: 5
},
{
tableTitle: "最高库存",
width:"100",
show_overflow_tooltip:true,
align:"center",
tableProp: "maxQty",
HeaderType:'normal',
tableTitleSE: 6
},
{
tableTitle: "来源库区名称",
width:"230",
show_overflow_tooltip:true,
align:"center",
tableProp: "fromName",
HeaderType:'normal',
tableTitleSE: 7
},
{
tableTitle: "来源库区代码",
width:"230",
show_overflow_tooltip:true,
align:"center",
tableProp: "fromCode",
HeaderType:'normal',
tableTitleSE: 8
},
{
tableTitle: "库龄",
width:"100",
show_overflow_tooltip:true,
align:"center",
tableProp: "cautionDays",
HeaderType:'normal',
tableTitleSE: 9
},
{
tableTitle: "单位",
width:"100",
show_overflow_tooltip:true,
align:"center",
tableProp: "unitOfMeasure",
HeaderType:'normal',
tableTitleSE: 10
},
{
tableTitle: "操作",
width:"100",
show_overflow_tooltip:true,
align:"center",
tableProp: "button",
HeaderType:'button',
tableTitleSE: 11
},
{
tableTitle: "创建人",
width:"80",
tableProp: "createdBy",
show_overflow_tooltip:true,
align:"center",
HeaderType:'normal',
tableTitleSE: 12
},
{
tableTitle: "创建时间",
width:"200",
tableProp: "createdDt",
show_overflow_tooltip:true,
align:"center",
HeaderType:'normal',
tableTitleSE: 13
},
{
tableTitle: "更新人",
width:"80",
tableProp: "updatedBy",
show_overflow_tooltip:true,
align:"center",
HeaderType:'normal',
tableTitleSE: 14
},
{
tableTitle: "更新时间",
width:"200",
tableProp: "updatedDt",
show_overflow_tooltip:true,
align:"center",
HeaderType:'normal',
tableTitleSE: 15
},
]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

View File

@ -0,0 +1,79 @@
module.exports={
tableName:"repair",
headerList:[
{
tableTitle: "维修代码",
width:"230",
show_overflow_tooltip:true,
align:"center",
tableProp: "repairCode",
tableTitleSE: 1
},
{
tableTitle: "维修描述",
width:"200",
show_overflow_tooltip:true,
align:"center",
tableProp: "repairText",
tableTitleSE: 2
},
{
tableTitle: "维修类型",
width:"160",
show_overflow_tooltip:true,
align:"center",
tableProp: "dictTypeShow",
tableTitleSE: 3
},
{
tableTitle: "是否启用",
width:"100",
show_overflow_tooltip:true,
align:"center",
tableProp: "repairEnabledShow",
tableTitleSE: 4
},
{
tableTitle: "工作中心名称",
width:"160",
show_overflow_tooltip:true,
align:"center",
tableProp: "workCenterName",
tableTitleSE: 5
},
{
tableTitle: "创建人",
width:"100",
tableProp: "createdBy",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 6
},
{
tableTitle: "创建时间",
width:"200",
tableProp: "createdDt",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 7
},
{
tableTitle: "更新人",
width:"100",
tableProp: "updatedBy",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 8
},
{
tableTitle: "更新时间",
width:"200",
tableProp: "updatedDt",
show_overflow_tooltip:true,
align:"center",
tableTitleSE: 9
},
]}

View File

@ -0,0 +1,19 @@
/*!
* angular-translate - v2.4.2 - 2014-10-21
* http://github.com/angular-translate/angular-translate
* Copyright (c) 2014 ; Licensed MIT
*/
angular.module('pascalprecht.translate').factory('$translateCookieStorage', [
'$cookieStore',
function ($cookieStore) {
var $translateCookieStorage = {
get: function (name) {
return $cookieStore.get(name);
},
set: function (name, value) {
$cookieStore.put(name, value);
}
};
return $translateCookieStorage;
}
]);

View File

@ -0,0 +1,6 @@
/*!
* angular-translate - v2.4.2 - 2014-10-21
* http://github.com/angular-translate/angular-translate
* Copyright (c) 2014 ; Licensed MIT
*/
angular.module("pascalprecht.translate").factory("$translateStaticFilesLoader",["$q","$http",function(a,b){return function(c){if(!c||!angular.isString(c.prefix)||!angular.isString(c.suffix))throw new Error("Couldn't load static files, no prefix or suffix specified!");var d=a.defer();return b(angular.extend({url:[c.prefix,c.key,c.suffix].join(""),method:"GET",params:""},c.$http)).success(function(a){d.resolve(a)}).error(function(){d.reject(c.key)}),d.promise}}]);

View File

@ -0,0 +1,15 @@
package com.cmeim.basic.query.entity;
import lombok.Data;
@Data
public class Query {
private String value;
private String text;
private String clazz;
private String alias;
private String type;
private String dictCode;
}

View File

@ -0,0 +1,194 @@
<template>
<div>
<form-generate ref="formgenerate" :lydata="lydata">
</form-generate>
<el-divider content-position="">上传质检报告</el-divider>
<el-row style="margin-left: 200px;text-align: center ;width:300px">
<el-upload
class="upload-demo"
ref="upload"
:headers="uploadHeaders"
:action="uploadurl"
:on-preview="handlePreview"
:on-remove="handleRemove"
:file-list="fileList"
:on-success="onSuccess"
:auto-upload="false"
>
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
</el-upload>
</el-row>
<el-row style="text-align: right ;margin-right: 10vw;margin-top: 10px">
<el-button type="primary" @click="handleSubmit">提交数据</el-button>
<el-button type="primary" @click="handleReset">返回</el-button>
</el-row>
</div>
</template>
<script>
import formGenerate from './formGenerate'
import { getToken } from '@/utils/auth'
export default {
props: {
layerid: {
type: String,
default: ''
},
lydata: {
type: Object,
default: () => {
return {}
}
}
},
name: 'check',
components: {
formGenerate
},
data: function() {
return {
fileLsit:[],
uploadHeaders:{},
uploadurl:[process.env.VUE_APP_BASE_API]+"/exec/exec/frock/Frockupload",
fileList: []//name ,url
}
}
,
mounted() {
this.uploadHeaders={'Authorization' : 'Bearer ' + getToken()}
if(this.lydata.filejson && this.lydata.filejson.length>0){
this.fileList=JSON.parse(this.lydata.filejson)
}
},
methods: {
//文件控件---------------start----》
submitUpload() {
this.$refs.upload.submit()
},
handleRemove(file, fileList) {
console.log(file, fileList)
},
handlePreview(file) {
console.log(file)
if(file.response.data[0].url.length>0)
window.open(file.response.data[0].url)
},
onSuccess(response, file, fileList){
console.log("response",response)
console.log("file",file)
console.log("fileList",fileList)
if(response.code==200){
this.lydata.filejson=JSON.stringify(fileList);
}else {
this.$message.error("文件上传失败=》"+response.msg)
}
this.lydata.pStutas=1//记录确认后状态,用于待确认功能 //已质检
this.lydata.dictFrockStutas=8//带确认检验
console.log( "提交数据======>",this.lydata)
// 加字段存报告文档信息
this.$frockApi.save(this.lydata).then((res) => {
console.log("质检==》",res)
if(res.status==200){
this.$parent.getData();
this.$layer.close(this.layerid)
this.$message.success("提交成功")
}else{
this.$message.error("数据提交异常===》",res.data.msg)
}
})
},
//文件控件------------------end-》
async handleSubmit() {
let params = {}
console.log(this.lydata)
console.log(this.lydata.doType)
if(this.lydata.doType=='check'){
this.$refs.upload.submit()//存在文件上传异步问题,在成功回调函数中调用接口
}
if(this.lydata.doType=='got'){
this.lydata.pStutas=5//记录确认后状态,用于待确认功能 //闲置
this.lydata.dictFrockStutas=4//已领用
this.lydata.Stutas='已领用'//参数是Stutas
this.$frockApi.changeStutas(this.lydata).then((res)=>{
console.log(res)
this.$parent.getData();
})
}
if(this.lydata.doType=='returnF'){
this.lydata.pStutas=5//记录确认后状态,用于待确认功能 //闲置
this.lydata.dictFrockStutas=5//闲置
this.lydata.Stutas='闲置'//参数是Stutas
this.$frockApi.changeStutas(this.lydata).then((res)=>{
console.log(res)
this.$parent.getData();
})
// 把当前值转移到上次使用值
await this.$refs.formgenerate.moveCurrentToLast()
}
if(this.lydata.doType=='suerF'){
// this.lydata.pStutas=5//记录确认后状态,用于待确认功能
this.lydata.dictFrockStutas=this.lydata.pstutas
this.lydata.Stutas= this.$dictType.getExFrockStatus(this.lydata.pstutas) //参数是Stutas
this.$frockApi.changeStutas(this.lydata).then((res)=>{
console.log(res)
this.$parent.getData();
})
}
let typeName;
switch (this.lydata.doType) {
case 'suerF':
typeName = '确认'
break
case 'got':
typeName = '取用'
break
case 'returnF':
typeName = '归还'
break
}
console.log(typeName, '---')
//模板提交
this.$refs.formgenerate.handleSubmit(typeName);
this.$layer.close(this.layerid)
},
handleReset() {
//重置下表单设置组件 这个显示按钮的变量
if (this.isOperate = true) {
this.lydata.isOperate = undefined
}
this.$layer.close(this.layerid)
}
}
}
</script>
<style scoped>
</style>

Some files were not shown because too many files have changed in this diff Show More