ソースを参照

增加区域管理模块
工厂模块增加区域字段
人员管理增加工厂字段

Z 1 年間 前
コミット
13be1924f9

+ 25 - 0
src/api/regionalManage/index.js

@@ -0,0 +1,25 @@
+import request from '@/utils/request';
+// 获取基本区域列表
+export async function basicAreaPageAPI(params) {
+  const res = await request.post(`/main/basicarea/page`, params);
+  if (res.data.code == 0) {
+    return res.data.data.list;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 保存基本区域
+export async function basicAreaSaveAPI(params) {
+  const res = await request.post(`/main/basicarea/save`, params);
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// 修改基本区域
+export async function basicAreaUpdateAPI(params) {
+  const res = await request.put(`/main/basicarea/update`, params);
+  if (res.data.code == 0) {
+    return res.data.message;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 4 - 3
src/enum/dict.js

@@ -41,9 +41,10 @@ export default {
   机构类型: 'group_type',
   工作流任务分配规则的类型: 'bpm_task_assign_rule_type',
   工作流任务分配自定义脚本: 'bpm_task_assign_script',
-  流程实例的结果:'bpm_process_instance_result',
-  角色数据权限字典:'role_data_authority_dic',
-
+  流程实例的结果: ' bpm_process_instance_result',
+  角色数据权限字典: 'role_data_authority_dic',
+  区域等级: 'main_area_level',
+  区域类型: 'main_area_type'
 };
 
 export const numberList = [

+ 229 - 0
src/views/enterpriseModel/regionalManage/components/area-edit.vue

@@ -0,0 +1,229 @@
+<!-- 机构编辑弹窗 -->
+<template>
+  <ele-modal
+    width="880px"
+    :visible.sync="visibleFlag"
+    :close-on-click-modal="false"
+    custom-class="ele-dialog-form"
+    :title="title"
+    :before-close="updateVisible"
+  >
+    <el-form ref="form" :model="form" :rules="rules" label-width="140px">
+      <el-row :gutter="15">
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item label="父区域:">
+            <area-select
+              :disabled="dialogType=='view'"
+              v-model="form.parentId"
+              :data="organizationList"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item label="区域等级:" prop="areaLevel">
+            <DictSelection dictName="区域等级" v-model="form.areaLevel" :disabled="dialogType=='view'"></DictSelection>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item label="区域类型:" prop="areaLevel">
+            <DictSelection dictName="区域类型" v-model="form.areaType" :disabled="dialogType=='view'"></DictSelection>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item label="区域名称:" prop="name">
+            <el-input
+
+              clearable
+              :maxlength="50"
+              v-model="form.name"
+              placeholder="请输入区域名称"
+              :disabled="dialogType=='view'"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item label="区域编码:" prop="areaCode">
+            <el-input
+              clearable
+              :maxlength="50"
+              v-model="form.areaCode"
+              placeholder="请输入区域编码"
+              :disabled="dialogType=='view'"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item label="排序:">
+            <el-input-number
+              style="width: 100%"
+              v-model="form.areaSort"
+              placeholder="请选择"
+              controls-position="right"
+              :min="1"
+            ></el-input-number>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
+          <el-form-item label="备注:">
+            <el-input
+              style="width: 100%"
+              v-model="form.remark"
+              type="textarea"
+            ></el-input>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="附件:">
+            <fileUpload
+              v-model="form.areaImg"
+              module="main"
+              :showLib="false"
+              :limit="1"
+            />
+          </el-form-item>
+
+
+        </el-col>
+
+      </el-row>
+    </el-form>
+
+
+    <template v-slot:footer>
+      <el-button @click="updateVisible(false)">取消</el-button>
+      <el-button type="primary" :loading="loading" @click="save">
+        保存
+      </el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+import areaSelect from './area-select.vue';
+import areaTypeSelect from './area-type-select.vue';
+import fileUpload from '@/components/upload/fileUpload';
+import {basicAreaSaveAPI, basicAreaUpdateAPI} from "@/api/regionalManage";
+
+
+
+export default {
+  components: {areaSelect, areaTypeSelect, fileUpload},
+  props: {
+    // 弹窗是否打开
+    visibleFlag: Boolean,
+    // 修改回显的数据
+    data: Object,
+    // 上级id
+    parentId: [Number, String],
+    // 数据
+    organizationList: Array
+  },
+  data() {
+    const defaultForm = {
+      id: null,
+      parentId: null,
+      areaCode: "",
+      areaImg: [],
+      areaLevel: "",
+      areaSort: 100,
+      areaType: "",
+      factoriesId: '',
+      name: "",
+      parentName: "",
+      remark: "",
+      stationCity: "",
+      stationCode: "",
+      stationCounty: "",
+      stationId: '',
+      stationName: "",
+      stationProvince: "",
+
+    };
+    return {
+      defaultForm,
+      responsibleName: '',
+      // 表单数据
+      form: {...defaultForm},
+      // 表单验证规则
+      rules: {
+        name: [
+          {required: true, message: '请输入区域名称', trigger: 'blur'}
+        ],
+        areaLevel: [
+          {required: true, message: '请选择区域等级', trigger: 'change'}
+        ],
+        areaType: [{required: true, message: '请选择区域类型', trigger: 'change'}],
+        areaCode: [{required: true, message: '请输入区域编码', trigger: 'blur'}],
+      },
+      // 提交状态
+      loading: false,
+      title: '',
+      // 是否是修改
+      isUpdate: false
+    };
+  },
+  computed: {
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  methods: {
+    init(type,row={}) {
+      this.title = type =='update'?'修改': type =='add'?'新增':'详情'
+      this.dialogType = type
+      if(type == 'update') {
+        let data = {...row}
+        Object.assign(this.form, data)
+      }
+    },
+    /* 保存编辑 */
+    async save() {
+      if (!(await this.formValidate())) {
+        return false;
+      }
+      this.loading = true;
+      const data = {
+        ...this.form,
+        parentId: this.form.parentId || 0
+      };
+      if (!this.dialogType == 'update') {
+        delete data.id;
+      }
+      const saveOrUpdate = this.dialogType == 'update' ? basicAreaUpdateAPI : basicAreaSaveAPI;
+      saveOrUpdate(data)
+        .then((msg) => {
+          this.loading = false;
+          this.$message.success(msg);
+          this.updateVisible(false);
+          this.$emit('done');
+        })
+        .catch((e) => {
+          this.loading = false;
+          // this.$message.error(e.message);
+        });
+    },
+    formValidate() {
+      return new Promise((resolve, reject) => {
+        this.$refs.form.validate((valid) => {
+          resolve(valid);
+        });
+      });
+    },
+    enterpriseValidate() {
+      return new Promise((resolve, reject) => {
+        this.$refs.enterpriseForm.validate((valid) => {
+          resolve(valid);
+        });
+      });
+    },
+
+
+    /* 更新visible */
+    updateVisible(value) {
+      this.$emit('update:visibleFlag', false);
+    }
+  }
+};
+</script>

+ 42 - 0
src/views/enterpriseModel/regionalManage/components/area-select.vue

@@ -0,0 +1,42 @@
+<!-- 机构选择下拉框 -->
+<template>
+  <ele-tree-select
+    ref="tree"
+    clearable
+    :value="value || ''"
+    :data="data"
+    label-key="name"
+    value-key="id"
+    default-expand-all
+    :placeholder="placeholder"
+    @input="updateValue"
+    v-bind="$attrs"
+    v-on="$listeners"
+  />
+</template>
+
+<script>
+  export default {
+    props: {
+      // 选中的数据(v-model)
+      value: [Number,String],
+      // 提示信息
+      placeholder: {
+        type: String,
+        default: '请选择'
+      },
+      // 机构数据
+      data: Array
+    },
+    methods: {
+      /* 更新选中数据 */
+      updateValue(value,node) {
+        this.$emit('input', value);
+        let nodesInfo = []
+         nodesInfo = this.$refs['tree'].getHalfCheckedKeys()
+         nodesInfo.push(value)
+        this.$emit('checkedKeys', nodesInfo)
+      },
+    }
+  };
+</script>

+ 57 - 0
src/views/enterpriseModel/regionalManage/components/area-type-select.vue

@@ -0,0 +1,57 @@
+<!-- 机构类型选择下拉框 -->
+<template>
+  <el-select
+    clearable
+    :value="value"
+    class="ele-fluid"
+    :placeholder="placeholder"
+    @input="updateValue"
+  >
+    <el-option
+      v-for="item in data"
+      :key="item.dictDataId"
+      :value="item.dictDataCode"
+      :label="item.dictDataName"
+    />
+  </el-select>
+</template>
+
+<script>
+  import { listDictionaryData } from '@/api/system/dictionary-data';
+
+  export default {
+    props: {
+      // 选中的数据(v-modal)
+      value: String,
+      // 提示信息
+      placeholder: {
+        type: String,
+        default: '请选择机构类型'
+      }
+    },
+    data() {
+      return {
+        // 机构类型数据
+        data: []
+      };
+    },
+    created() {
+      /* 获取机构类型数据 */
+      listDictionaryData({
+        dictCode: 'organization_type'
+      })
+        .then((list) => {
+          this.data = list;
+        })
+        .catch((e) => {
+          // this.$message.error(e.message);
+        });
+    },
+    methods: {
+      /* 更新选中数据 */
+      updateValue(value) {
+        this.$emit('input', value);
+      }
+    }
+  };
+</script>

+ 281 - 2
src/views/enterpriseModel/regionalManage/index.vue

@@ -1,3 +1,282 @@
 <template>
-    <div>暂未开发</div>
-</template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        row-key="id"
+        :columns="columns"
+        :datasource="datasource"
+        :default-expand-all="false"
+        :need-page="false"
+        cache-key="systemMenuTable"
+        @done=""
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit('add')"
+          >
+            添加
+          </el-button>
+          <el-button class="ele-btn-icon" size="small" @click="expandAll">
+            展开全部
+          </el-button>
+          <el-button class="ele-btn-icon" size="small" @click="foldAll">
+            折叠全部
+          </el-button>
+        </template>
+        <!-- 标题列 -->
+        <template v-slot:areaImg="{ row }">
+          <el-button v-if="row.areaImg.length" @click="downloadFile(row.areaImg[0])" type="text">查看</el-button>
+        </template>
+
+
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="openEdit('update',row)"
+          >
+            修改
+          </el-link>
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除吗?"
+            @confirm="remove(row)"
+            v-if="row.id != 99999"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+      </ele-pro-table>
+    </el-card>
+    <!-- 编辑弹窗 -->
+    <area-edit
+      v-if="showEdit"
+      :visibleFlag.sync="showEdit"
+      ref="areaEditRef"
+      :data="editData"
+      :parent-id="parentId"
+      :organization-list="data"
+      @done="reload"
+    />
+  </div>
+</template>
+
+<script>
+
+import areaEdit from './components/area-edit.vue';
+import {
+  listOrganizations,
+  removeOrganization
+} from '@/api/system/organization';
+import {basicAreaPageAPI} from "@/api/regionalManage";
+import {getByCode} from "@/api/system/dictionary-data";
+import {getFile} from "@/api/system/file";
+
+export default {
+  name: 'SystemOrganization',
+  components: {areaEdit},
+  data() {
+    return {
+      // 加载状态
+      loading: false,
+      // 列表数据
+      data: [],
+      // 选中数据
+      current: null,
+      // 是否显示表单弹窗
+      showEdit: false,
+      // 编辑回显数据
+      editData: null,
+      // 上级id
+      parentId: null,
+      dictList:{}
+    };
+  },
+  computed: {
+    // 表格列配置
+    columns() {
+      return [
+        {
+          columnKey: 'index',
+          type: 'index',
+          width: 45,
+          align: 'center',
+          showOverflowTooltip: true,
+          fixed: 'left'
+        },
+        {
+          prop: 'name',
+          label: '区域名称',
+          showOverflowTooltip: true,
+          align: 'center',
+          minWidth: 110,
+          slot: 'name'
+        },
+        {
+          prop: 'areaCode',
+          label: '区域编码',
+          showOverflowTooltip: true,
+          align: 'center',
+          minWidth: 110,
+        },
+        {
+          prop: 'areaImg',
+          label: '地图/示意图',
+          showOverflowTooltip: true,
+          align: 'center',
+          minWidth: 110,
+          slot: 'areaImg'
+
+        },
+        {
+          prop: 'areaLevel',
+          label: '区域等级',
+          showOverflowTooltip: true,
+          align: 'center',
+          formatter: (row, column) => {
+            return this.getDictV('main_area_level',row.areaLevel) ;
+          },
+          minWidth: 110,
+        },
+        {
+          prop: 'areaType',
+          label: '区域类型',
+          showOverflowTooltip: true,
+          align: 'center',
+          formatter: (row, column) => {
+            return this.getDictV('main_area_type',row.areaLevel) ;
+          },
+          minWidth: 110,
+        },
+        {
+          prop: 'areaSort',
+          label: '排序',
+          showOverflowTooltip: true,
+          align: 'center',
+          width: 60
+        },
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 190,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          showOverflowTooltip: true
+        }
+      ]
+    },
+  },
+  created() {
+    //this.query();
+  },
+  methods: {
+    getDictV(code, val) {
+      if (!this.dictList[code]) return '';
+      return this.dictList[code].find(item => item.value == val)?.label
+    },
+    async getDictList(code) {
+      let {data: res} = await getByCode(code)
+      this.dictList[code] = res.map(item => {
+        let values = Object.keys(item)
+        return {
+          value: values[0],
+          label: item[values[0]]
+        }
+      })
+    },
+    downloadFile(file) {
+      getFile({objectName: file.storePath}, file.type);
+    },
+    /* 查询 */
+    async datasource() {
+      await this.getDictList('main_area_level')
+      await this.getDictList('main_area_type')
+      const data = await basicAreaPageAPI(
+        {
+          pageNum: 1,
+          size: 9999
+        }
+      )
+      this.data = this.$util.toTreeData({
+        data: data,
+        idField: 'id',
+        parentIdField: 'parentId'
+      });
+      return this.data
+
+    },
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload();
+    },
+    /* 展开全部 */
+    expandAll() {
+      this.$refs.table.toggleRowExpansionAll(true);
+    },
+    /* 折叠全部 */
+    foldAll() {
+      this.$refs.table.toggleRowExpansionAll(false);
+    },
+    /* 显示编辑 */
+    openEdit(type,row) {
+      this.showEdit = true;
+      this.$nextTick(() => {
+        this.$refs.areaEditRef.init(type,row);
+      });
+    },
+    /* 删除 */
+    remove() {
+      this.$confirm('确定要删除选中的机构吗?', '提示', {
+        type: 'warning'
+      }).then(() => {
+          const loading = this.$loading({lock: true});
+          removeOrganization([this.current.id])
+            .then((msg) => {
+              loading.close();
+              this.$message.success(msg);
+              this.reload();
+            })
+            .catch((e) => {
+              loading.close();
+              // this.$message.error(e.message);
+            });
+        })
+        .catch(() => {
+        });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.sys-organization-list {
+  height: calc(100vh - 264px);
+  box-sizing: border-box;
+  border-width: 1px;
+  border-style: solid;
+  overflow: auto;
+}
+
+.sys-organization-list :deep(.el-tree-node__content) {
+  height: 40px;
+
+  & > .el-tree-node__expand-icon {
+    margin-left: 10px;
+  }
+}
+</style>

+ 36 - 1
src/views/factoryModel/factoryManagement/components/edit.vue

@@ -95,6 +95,16 @@
             </el-select>
           </el-form-item>
         </el-col>
+        <el-col :span="8">
+          <el-form-item label="区域:" prop="location_city">
+            <area-select
+              v-model="form.areaId"
+              @checkedKeys="getAreaInfo"
+              :data="areaTreeList"
+              ref="tree"
+            />
+          </el-form-item>
+        </el-col>
         <el-col :span="16">
           <el-form-item label="地址:" prop="location_city">
             <div class="location-warp">
@@ -130,7 +140,10 @@ import { cityDataLabel } from 'ele-admin/packages/utils/regions';
 import { listOrganizations } from '@/api/system/organization';
 import { saveOrUpdate } from '@/api/factoryModel';
 import { getUserPage } from '@/api/system/organization';
+import AreaSelect from "@/views/enterpriseModel/regionalManage/components/area-select.vue";
+import {basicAreaPageAPI} from "@/api/regionalManage";
 export default {
+  components: {AreaSelect},
   props: {
     options_groupId: {
       type: Array,
@@ -151,6 +164,8 @@ export default {
         code: '',
         name: '',
         groupId: '',
+        areaId: '',
+        areaName: '',
         extInfo: {
           principalDep: '', // 负责人部门
           location: [],
@@ -181,6 +196,8 @@ export default {
         ]
       },
       visible: false,
+      areaList: [],
+      areaTreeList: [],
       type: '', // add/edit
       loading: false,
       options: {
@@ -216,6 +233,7 @@ export default {
   },
   created() {
     this.getGs();
+    this.getBasicAreaList();
   },
   methods: {
     open(type, row) {
@@ -276,10 +294,27 @@ export default {
       this.restForm();
       this.visible = false;
     },
+    /* 获取区域集合 */
+    async getBasicAreaList() {
+      this.areaList = await basicAreaPageAPI(
+        {
+          pageNum: 1,
+          size: 9999
+        }
+      )
+      this.areaTreeList = this.$util.toTreeData({
+        data: this.areaList,
+        idField: 'id',
+        parentIdField: 'parentId'
+      });
+
+    },
+    getAreaInfo(val) {
+      this.form.areaName = this.areaList.find((item) => item.id == val[0]).name;
+    },
     // 获取公司数据
     getGs() {
       listOrganizations().then((list) => {
-        console.log(list);
         this.options.groupId = this.$util.toTreeData({
           data: list,
           idField: 'id',

+ 4 - 0
src/views/factoryModel/factoryManagement/index.vue

@@ -86,6 +86,10 @@
             prop: 'groupId',
             slot: 'groupId'
           },
+          {
+            label: '区域名',
+            prop: 'areaName',
+          },
           {
             label: '省/市/区',
             prop: 'extInfo.location'

+ 40 - 2
src/views/factoryModel/plant/components/edit.vue

@@ -9,7 +9,7 @@
     :close-on-press-escape="false"
     width="1200px"
   >
- 
+
     <el-form ref="form" :model="form" :rules="rules" label-width="120px">
       <el-row>
         <el-col :span="8">
@@ -188,6 +188,16 @@
             ></el-input>
           </el-form-item>
         </el-col>
+        <el-col :span="8">
+          <el-form-item label="区域:" prop="location_city">
+            <area-select
+              v-model="form.areaId"
+              @checkedKeys="getAreaInfo"
+              :data="areaTreeList"
+              ref="tree"
+            />
+          </el-form-item>
+        </el-col>
         <el-col :span="24" style="margin-bottom: 12px">
           <el-form-item label="地址:" prop="extInfo.location">
             <div class="location-warp">
@@ -233,7 +243,10 @@
 import { saveOrUpdate, listWorkshopByParentId } from '@/api/factoryModel';
 import { getUserPage } from '@/api/system/organization';
 import { cityDataLabel } from 'ele-admin/packages/utils/regions';
+import AreaSelect from "@/views/enterpriseModel/regionalManage/components/area-select.vue";
+import {basicAreaPageAPI} from "@/api/regionalManage";
 export default {
+  components: {AreaSelect},
   props: {
     options_groupId: {
       type: Array,
@@ -253,12 +266,17 @@ export default {
       this.toTreeData(nval);
     }
   },
+  created() {
+    this.getBasicAreaList();
+  },
   data() {
     const defaultForm = {
       id: '',
       code: '',
       name: '',
       leaderId:'',
+      areaId: '',
+      areaName: '',
       extInfo: {
         principalDep: '', // 负责人部门
         phone: '', // 手机号
@@ -275,12 +293,14 @@ export default {
       enabled: 1,
       parentId: '',
       remark: '',
-      type: 2 //  FACTORY(1, "工厂"), WORKSHOP_PLAN(2, "厂房"), WORKSHOP(3, "车间"), LINE(4, "厂线");
+      type: 2, //  FACTORY(1, "工厂"), WORKSHOP_PLAN(2, "厂房"), WORKSHOP(3, "车间"), LINE(4, "厂线");
     };
     return {
       defaultForm,
       // 表单数据
       form: { ...defaultForm },
+      areaList: [],
+      areaTreeList: [],
       // 表单验证规则
       rules: {
         code: [{ required: true, message: '请输入', trigger: 'blur' }],
@@ -358,6 +378,24 @@ export default {
     }
   },
   methods: {
+    /* 获取区域集合 */
+    async getBasicAreaList() {
+      this.areaList = await basicAreaPageAPI(
+        {
+          pageNum: 1,
+          size: 9999
+        }
+      )
+      this.areaTreeList = this.$util.toTreeData({
+        data: this.areaList,
+        idField: 'id',
+        parentIdField: 'parentId'
+      });
+
+    },
+    getAreaInfo(val) {
+      this.form.areaName = this.areaList.find((item) => item.id == val[0]).name;
+    },
     open(type, row) {
       this.type = type;
       this.visible = true;

+ 4 - 1
src/views/factoryModel/plant/index.vue

@@ -118,7 +118,10 @@
             prop: 'extInfo.parentId',
             slot: 'factory'
           },
-
+          {
+            label: '区域名',
+            prop: 'areaName',
+          },
           {
             label: '省/市/区',
             prop: 'extInfo.location'

+ 38 - 2
src/views/factoryModel/productionLine/components/edit.vue

@@ -165,6 +165,16 @@
                </el-select>
              </el-form-item>
            </el-col>
+           <el-col :span="8">
+             <el-form-item label="区域:" prop="location_city">
+               <area-select
+                 v-model="form.areaId"
+                 @checkedKeys="getAreaInfo"
+                 :data="areaTreeList"
+                 ref="tree"
+               />
+             </el-form-item>
+           </el-col>
            <el-col :span="24" style="margin-bottom: 12px">
              <el-form-item label="地址:" prop="extInfo.location">
                <div class="location-warp">
@@ -287,7 +297,10 @@ import { saveOrUpdate, listWorkshopByParentId } from '@/api/factoryModel';
 import { getUserPage } from '@/api/system/organization';
 import { deepClone } from '@/components/FormGenerator/utils';
 import { cityDataLabel } from 'ele-admin/packages/utils/regions';
+import {basicAreaPageAPI} from "@/api/regionalManage";
+import AreaSelect from "@/views/enterpriseModel/regionalManage/components/area-select.vue";
 export default {
+  components: {AreaSelect},
   props: {
     options_groupId: {
       type: Array,
@@ -307,6 +320,9 @@ export default {
       this.toTreeData(nval);
     }
   },
+  created() {
+    this.getBasicAreaList();
+  },
   data() {
     const defaultForm = {
       id: '',
@@ -371,7 +387,9 @@ export default {
         ],
         cityDataLabel
       },
-      delList:[]
+      delList:[],
+      areaList: [],
+      areaTreeList: [],
     };
   },
   computed: {
@@ -423,7 +441,7 @@ export default {
        return time
     },
     open(type, row) {
-     
+
       this.type = type;
       this.visible = true;
       if (type == 'edit') {
@@ -458,6 +476,24 @@ export default {
          this.$refs.form.resetFields();
       }
     },
+    /* 获取区域集合 */
+    async getBasicAreaList() {
+      this.areaList = await basicAreaPageAPI(
+        {
+          pageNum: 1,
+          size: 9999
+        }
+      )
+      this.areaTreeList = this.$util.toTreeData({
+        data: this.areaList,
+        idField: 'id',
+        parentIdField: 'parentId'
+      });
+
+    },
+    getAreaInfo(val) {
+      this.form.areaName = this.areaList.find((item) => item.id == val[0]).name;
+    },
     /* 保存编辑 */
     save() {
       this.$refs.form.validate((valid) => {

+ 5 - 0
src/views/factoryModel/productionLine/index.vue

@@ -78,6 +78,10 @@ export default {
           prop: 'parentCode',
           slot: 'parent'
         },
+        {
+          label: '区域名',
+          prop: 'areaName',
+        },
         {
           label: '所属工厂 - 厂房',
           prop: 'extInfo.factoryId',
@@ -90,6 +94,7 @@ export default {
           prop: 'parentId',
           slot: 'workshop'
         },
+
         {
           label: '省/市/区',
           prop: 'extInfo.location'

+ 38 - 3
src/views/factoryModel/station/components/edit.vue

@@ -25,7 +25,16 @@
               </el-select>
             </el-form-item>
           </el-col>
-
+          <el-col :span="8">
+            <el-form-item label="区域:" prop="location_city">
+              <area-select
+                v-model="form.areaId"
+                @checkedKeys="getAreaInfo"
+                :data="areaTreeList"
+                ref="tree"
+              />
+            </el-form-item>
+          </el-col>
           <el-col :span="8">
             <el-form-item label="设备编码:" prop="extInfo.assetCode" v-if="form.extInfo.type == 1">
               <el-input v-model="form.extInfo.assetCode" readonly @click.native="chooseAsset" />
@@ -33,7 +42,7 @@
           </el-col>
 
 
-        
+
 
           <el-col :span="8">
             <el-form-item label="设备名称:" prop="extInfo.assetName" v-if="form.extInfo.type == 1">
@@ -177,8 +186,11 @@ import producetask from '@/api/technology/production';
 import work from '@/api/technology/work';
 import ProduceDialog from './ProduceDialog'
 import CodeDialog from './codeDialog.vue'
+import AreaSelect from "@/views/enterpriseModel/regionalManage/components/area-select.vue";
+import {basicAreaPageAPI} from "@/api/regionalManage";
 export default {
   components: {
+    AreaSelect,
     ProductModal,
     ProduceDialog,
     CodeDialog
@@ -198,6 +210,9 @@ export default {
       this.toTreeData(nval);
     }
   },
+  created() {
+    this.getBasicAreaList();
+  },
   data() {
     const defaultForm = function () {
       return {
@@ -318,7 +333,9 @@ export default {
             label: '日'
           }
         ],
-        productionLineId: []
+        productionLineId: [],
+        areaList: [],
+        areaTreeList: [],
       }
     };
   },
@@ -400,6 +417,24 @@ export default {
       this.getListWorkCenter();
       this.getListProduce();
     },
+    /* 获取区域集合 */
+    async getBasicAreaList() {
+      this.areaList = await basicAreaPageAPI(
+        {
+          pageNum: 1,
+          size: 9999
+        }
+      )
+      this.areaTreeList = this.$util.toTreeData({
+        data: this.areaList,
+        idField: 'id',
+        parentIdField: 'parentId'
+      });
+
+    },
+    getAreaInfo(val) {
+      this.form.areaName = this.areaList.find((item) => item.id == val[0]).name;
+    },
     /* 保存编辑 */
     save() {
       this.$refs.form.validate((valid) => {

+ 4 - 0
src/views/factoryModel/station/index.vue

@@ -108,6 +108,10 @@
             prop: 'leaderName',
             slot: 'factory'
           },
+          {
+            label: '区域名',
+            prop: 'areaName',
+          },
           {
             label: '所属工厂 - 厂房',
             prop: 'parentId',

+ 38 - 2
src/views/factoryModel/workshop/components/edit.vue

@@ -58,7 +58,7 @@
         </el-col>
         <el-col :span="12">
 
-   
+
           <el-form-item label="所属厂房:" prop="parentId" style="margin-bottom: 22px">
             <el-select
               v-model="form.parentId"
@@ -66,7 +66,7 @@
               placeholder="请选择所属厂房"
               style="width: 100%"
             >
-         
+
               <el-option
                 v-for="item in options_factory"
                 :key="item.id"
@@ -99,6 +99,16 @@
             />
           </el-form-item>
         </el-col>
+        <el-col :span="12">
+          <el-form-item label="区域:" prop="location_city">
+            <area-select
+              v-model="form.areaId"
+              @checkedKeys="getAreaInfo"
+              :data="areaTreeList"
+              ref="tree"
+            />
+          </el-form-item>
+        </el-col>
         <el-col :span="12">
           <el-form-item label="地址:" prop="location_city"
             style="margin-bottom: 22px"
@@ -127,6 +137,8 @@ import { saveOrUpdate } from '@/api/factoryModel';
 import { getUserPage } from '@/api/system/organization';
 import deptSelect from '@/components/CommomSelect/dept-select.vue';
 import personSelect from '@/components/CommomSelect/person-select.vue';
+import AreaSelect from "@/views/enterpriseModel/regionalManage/components/area-select.vue";
+import {basicAreaPageAPI} from "@/api/regionalManage";
 export default {
   props: {
     options_groupId: {
@@ -148,9 +160,13 @@ export default {
     }
   },
   components: {
+    AreaSelect,
     deptSelect,
     personSelect
   },
+  created() {
+    this.getBasicAreaList();
+  },
   data() {
     const defaultForm = function () {
       return {
@@ -190,6 +206,8 @@ export default {
       visible: false,
       type: '', // add/edit
       loading: false,
+      areaList: [],
+      areaTreeList: [],
       options: {
         groupId: [],
         leaderId: []
@@ -232,6 +250,24 @@ export default {
         }
       }
     },
+    /* 获取区域集合 */
+    async getBasicAreaList() {
+      this.areaList = await basicAreaPageAPI(
+        {
+          pageNum: 1,
+          size: 9999
+        }
+      )
+      this.areaTreeList = this.$util.toTreeData({
+        data: this.areaList,
+        idField: 'id',
+        parentIdField: 'parentId'
+      });
+
+    },
+    getAreaInfo(val) {
+      this.form.areaName = this.areaList.find((item) => item.id == val[0]).name;
+    },
     /* 保存编辑 */
     save() {
       this.$refs.form.validate((valid) => {

+ 6 - 3
src/views/factoryModel/workshop/index.vue

@@ -37,7 +37,7 @@
           <!-- {{ showgfactory(row, 1) }} -->
           {{  pathFn(row.pathName) }}
         </template>
-  
+
         <!-- 操作列 -->
         <template v-slot:action="{ row }">
           <el-link
@@ -106,14 +106,17 @@
             label: '工厂编码',
             prop: 'parentCode',
             slot: 'parent'
-           
+
           },
           {
             label: '所属工厂 - 厂房',
             prop: 'parentId',
             slot: 'factory'
           },
-   
+          {
+            label: '区域名',
+            prop: 'areaName',
+          },
           {
             label: '详细地址',
             prop: 'extInfo.location'

+ 65 - 43
src/views/system/organization/components/org-user-edit.vue

@@ -1,29 +1,29 @@
 <!-- 用户编辑弹窗 -->
 <template>
   <ele-modal width="800px" :visible="visible" :close-on-click-modal="false" custom-class="ele-dialog-form"
-    :title="isUpdate ? '修改人员' : '添加人员'" @update:visible="updateVisible">
+             :title="isUpdate ? '修改人员' : '添加人员'" @update:visible="updateVisible">
     <el-form ref="form" :model="form" :rules="rules" label-width="82px">
       <el-row :gutter="15">
         <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
           <el-form-item label="所属机构:">
             <org-select :data="organizationList" placeholder="请选择所属机构" v-model="form.groupId"
-              @checkedKeys="checkedKeys" />
+                        @checkedKeys="checkedKeys"/>
           </el-form-item>
 
           <el-form-item label="负责部门:">
 
 
-            <el-cascader class="ele-block" :options="organizationList" placeholder="请选择负责部门" :props="defaultProps"
-              collapse-tags v-model="deptTree" clearable></el-cascader>
+            <el-cascader class="ele-block" :options="organizationList" placeholder="请选择负责部门"
+                         :props="defaultProps"
+                         collapse-tags v-model="deptTree" clearable></el-cascader>
 
           </el-form-item>
 
 
-
           <el-form-item label="性别:" prop="sex">
             <el-select clearable class="ele-block" v-model="form.sex" placeholder="请选择性别">
-              <el-option label="男" :value="1" />
-              <el-option label="女" :value="2" />
+              <el-option label="男" :value="1"/>
+              <el-option label="女" :value="2"/>
             </el-select>
           </el-form-item>
           <el-form-item label="员工状态:" prop="status">
@@ -34,7 +34,7 @@
           </el-form-item>
 
           <el-form-item label="岗位:" prop="postName">
-            <el-input clearable :maxlength="100" v-model="form.postName" placeholder="请输入岗位" />
+            <el-input clearable :maxlength="100" v-model="form.postName" placeholder="请输入岗位"/>
           </el-form-item>
 
           <el-form-item label="工种:" prop="workTypeId">
@@ -43,49 +43,60 @@
           </el-form-item>
 
           <el-form-item label="籍贯:" prop="city">
-            <regions-select style="width: 100%" v-model="city" placeholder="请选择省市区" />
+            <regions-select style="width: 100%" v-model="city" placeholder="请选择省市区"/>
           </el-form-item>
           <el-form-item label="生日:" prop="age">
             <el-date-picker style="width: 100%" clearable v-model="form.birthday" type="date" value-format="yyyy-MM-dd"
-              placeholder="请选择日期">
+                            placeholder="请选择日期">
             </el-date-picker>
           </el-form-item>
           <el-form-item label="入职时间:" prop="joinDate">
             <el-date-picker style="width: 100%" clearable v-model="form.joinDate" type="date" value-format="yyyy-MM-dd"
-              placeholder="请选择日期">
+                            placeholder="请选择日期">
             </el-date-picker>
           </el-form-item>
           <el-form-item label="毕业院校:" prop="school">
-            <el-input clearable :maxlength="100" v-model="form.school" placeholder="请输入毕业院校" />
+            <el-input clearable :maxlength="100" v-model="form.school" placeholder="请输入毕业院校"/>
           </el-form-item>
           <el-form-item label="微信号:" prop="wxId">
-            <el-input clearable :maxlength="100" v-model="form.wxId" placeholder="请输入微信号" />
+            <el-input clearable :maxlength="100" v-model="form.wxId" placeholder="请输入微信号"/>
           </el-form-item>
         </el-col>
         <el-col v-bind="styleResponsive ? { sm: 12 } : { span: 12 }">
           <el-form-item label="工号:" prop="jobNumber">
             <el-input clearable type="text" :maxlength="10" v-model="form.jobNumber" placeholder="请输入工号"
-              onkeyup="value=value.replace(/[^\x00-\xff]/g, '')" />
+                      onkeyup="value=value.replace(/[^\x00-\xff]/g, '')"/>
           </el-form-item>
           <el-form-item label="姓名:" prop="name">
-            <el-input clearable :maxlength="20" v-model="form.name" placeholder="请输入姓名" />
+            <el-input clearable :maxlength="20" v-model="form.name" placeholder="请输入姓名"/>
           </el-form-item>
           <el-form-item label="用户账号:">
-            <el-input :disabled="true" :maxlength="11" v-model="form.loginName" v-if="isUpdate && data.accountId" />
-            <el-select clearable class="ele-block" v-model="form.accountId" filterable placeholder="请选择用户账号" v-else>
+            <el-input :disabled="true" :maxlength="11" v-model="form.loginName" v-if="isUpdate && data.accountId"/>
+            <el-select clearable class="ele-block" v-model="form.accountId" filterable placeholder="请选择用户账号"
+                       v-else>
               <el-option v-for="item in accountList" :key="item.id" :label="item.loginName" :value="item.id">
               </el-option>
             </el-select>
           </el-form-item>
           <el-form-item label="手机号:" prop="phone">
-            <el-input clearable :maxlength="11" v-model="form.phone" placeholder="请输入手机号" />
+            <el-input clearable :maxlength="11" v-model="form.phone" placeholder="请输入手机号"/>
           </el-form-item>
           <el-form-item label="邮箱:" prop="email">
-            <el-input clearable :maxlength="100" v-model="form.email" placeholder="请输入邮箱" />
+            <el-input clearable :maxlength="100" v-model="form.email" placeholder="请输入邮箱"/>
           </el-form-item>
           <el-form-item label="年龄:" prop="age">
             <el-input type="number" clearable :maxlength="100" v-model="form.age" placeholder="请输入年龄"
-              onkeyup="value=value.replace(/[^\d.]/g,'')" />
+                      onkeyup="value=value.replace(/[^\d.]/g,'')"/>
+          </el-form-item>
+          <el-form-item label="所属工厂:">
+            <el-select style="width: 100%" clearable v-model="form.factoryId" filterable placeholder="请选择所属工厂">
+              <el-option
+                v-for="item in factoryList"
+                :label="item.name"
+                :value="item.id"
+                :key="item.id"
+              ></el-option>
+            </el-select>
           </el-form-item>
         </el-col>
       </el-row>
@@ -102,18 +113,20 @@
 </template>
 
 <script>
-import { emailReg, phoneReg } from 'ele-admin';
+import {emailReg, phoneReg} from 'ele-admin';
 import OrgSelect from './org-select.vue';
 import RoleSelect from '@/views/system/user/components/role-select.vue';
 import RegionsSelect from '@/components/RegionsSelect/index.vue';
-import { getNotBoundAccount } from '@/api/system/user';
+import {getNotBoundAccount} from '@/api/system/user';
 import {
   getUserDetail,
   saveOrUpdateUser,
   checkExistence
 } from '@/api/system/organization';
+import {getFactoryarea} from "@/api/factoryModel";
+
 export default {
-  components: { OrgSelect, RoleSelect, RegionsSelect },
+  components: {OrgSelect, RoleSelect, RegionsSelect},
   props: {
     // 弹窗是否打开
     visible: Boolean,
@@ -127,8 +140,7 @@ export default {
   data() {
     const defaultForm = {
       id: null,
-      deptIds: [
-      ],
+      deptIds: [],
 
       groupId: null,
       name: '',
@@ -137,22 +149,23 @@ export default {
       phone: '',
       age: '',
       accountId: '',
+      factoryId: '',
       workTypeId: ''
     };
     return {
       defaultForm,
       // 表单数据
-      form: { ...defaultForm },
+      form: {...defaultForm},
       // 表单验证规则
       rules: {
-        name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
-        sex: [{ required: true, message: '请选择性别', trigger: 'blur' }],
+        name: [{required: true, message: '请输入姓名', trigger: 'blur'}],
+        sex: [{required: true, message: '请选择性别', trigger: 'blur'}],
         email: [
-          { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
+          {pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur'}
         ],
         phone: [
-          { required: true, message: '请输入手机号', trigger: 'blur' },
-          { pattern: phoneReg, message: '手机号格式不正确', trigger: 'blur' }
+          {required: true, message: '请输入手机号', trigger: 'blur'},
+          {pattern: phoneReg, message: '手机号格式不正确', trigger: 'blur'}
         ],
         jobNumber: [
           {
@@ -176,20 +189,21 @@ export default {
             }
           }
         ],
-        status: [{ required: true, message: '请选择员工状态', trigger: 'blur' }]
+        status: [{required: true, message: '请选择员工状态', trigger: 'blur'}]
       },
       // 提交状态
       loading: false,
       // 是否是修改
       isUpdate: false,
       city: '',
+      factoryList: [],
       statusOptions: [
-        { value: 1, label: '全职' },
-        { value: 2, label: '兼职' },
-        { value: 3, label: '实习' },
-        { value: 4, label: '正式' },
-        { value: 5, label: '试用' },
-        { value: 6, label: '离职' }
+        {value: 1, label: '全职'},
+        {value: 2, label: '兼职'},
+        {value: 3, label: '实习'},
+        {value: 4, label: '正式'},
+        {value: 5, label: '试用'},
+        {value: 6, label: '离职'}
       ],
       accountList: [],
 
@@ -209,12 +223,23 @@ export default {
       return this.$store.state.theme.styleResponsive;
     }
   },
+  created() {
+    this.getFactoryList()
+  },
   methods: {
     getAccountList() {
       getNotBoundAccount().then((res) => {
         this.accountList = res;
       });
     },
+    async getFactoryList() {
+      const {list} = await getFactoryarea({
+        pageNum: 1,
+        size: 999,
+        type: 1
+      });
+      this.factoryList = list || []
+    },
     /* 保存编辑 */
     save() {
       this.$refs.form.validate((valid) => {
@@ -233,8 +258,6 @@ export default {
         }
 
 
-
-
         const data = {
           ...this.form
         };
@@ -276,7 +299,7 @@ export default {
         this.getAccountList();
         if (this.data) {
           getUserDetail(this.data.id).then((res) => {
-            this.form = { ...res };
+            this.form = {...res};
 
             this.deptTree = []
             this.form.deptIds = []
@@ -285,7 +308,6 @@ export default {
             }
 
 
-
             this.city = res.addressId ? res.addressId.toString() : null;
             this.isUpdate = true;
           });
@@ -305,7 +327,7 @@ export default {
       } else {
         this.city = null;
         this.$refs.form.clearValidate();
-        this.form = { ...this.defaultForm };
+        this.form = {...this.defaultForm};
       }
     }
   }

+ 4 - 1
src/views/system/role/components/role-data-auth.vue

@@ -92,7 +92,10 @@ export default {
       this.form = row
       this.form.dataScope = this.form.dataScope + ''
       this.$nextTick(()=>{
-        this.$refs.tree.setCheckedKeys(this.form.dataScopeDeptIds.split(','))
+        if(this.form.dataScope=='2'){
+          this.$refs.tree.setCheckedKeys(this.form.dataScopeDeptIds.split(','))
+        }
+
       })
 
     },

+ 68 - 7
src/views/system/role/components/role-edit.vue

@@ -25,7 +25,7 @@
           default-expand-all
           placeholder="请选择所属机构"
             v-model="form.groupId"
-       
+
         />
       </el-form-item>
       <el-form-item label="启用状态:" prop="enable">
@@ -38,6 +38,35 @@
         >
         </el-switch>
       </el-form-item>
+      <el-form-item label="权限范围" prop="dataScope">
+        <DictSelection
+          dictName="角色数据权限字典"
+          clearable
+          v-model="form.dataScope"
+        >
+        </DictSelection>
+      </el-form-item>
+      <el-form-item prop="dataScope">
+        <el-scrollbar
+          v-if="form.dataScope=='2'"
+          v-loading="authLoading"
+          style="height: 40vh"
+          wrap-style="overflow-x: hidden;">
+          <el-tree
+            ref="tree"
+            :data="deptData"
+            :check-strictly="true"
+            highlight-current
+            node-key="id"
+            :props="{ label: 'name' }"
+            :expand-on-click-node="false"
+            show-checkbox
+            :default-expand-all="true"
+            :default-checked-keys="checkedKeys"
+          />
+        </el-scrollbar>
+      </el-form-item>
+
     </el-form>
     <template v-slot:footer>
       <el-button @click="updateVisible(false)">取消</el-button>
@@ -61,11 +90,16 @@
       // 修改回显的数据
       data: Object
     },
+    created() {
+      this.getListOrganizations()
+    },
     data() {
       const defaultForm = {
         name: '',
         groupId: '',
-        enable: 1
+        enable: 1,
+        dataScope: '',
+        dataScopeDeptIds: ''
       };
       return {
         defaultForm,
@@ -92,13 +126,14 @@
         loading: false,
         // 是否是修改
         isUpdate: false,
+        authLoading: false,
 
         organizationList: []
       };
     },
     methods: {
 
-      
+
       query() {
         this.loading = true;
         listOrganizations()
@@ -109,14 +144,30 @@
               idField: 'id',
               parentIdField: 'parentId'
             });
-      
+
           })
           .catch((e) => {
             this.loading = false;
-        
+
           });
       },
-
+    getListOrganizations(){
+      this.authLoading = true;
+      listOrganizations()
+        .then((list) => {
+          let _list = list.filter((i) => i.name != '超级管理员')
+          this.authLoading = false;
+          this.deptData = this.$util.toTreeData({
+            data: _list,
+            idField: 'id',
+            parentIdField: 'parentId'
+          });
+        })
+        .catch((e) => {
+          this.loading = false;
+          // this.$message.error(e.message);
+        });
+    },
       /* 保存编辑 */
       save() {
         this.$refs.form.validate((valid) => {
@@ -124,7 +175,10 @@
             return false;
           }
           this.loading = true;
-
+          if(this.form.dataScope=='2'){
+            const ids = this.$refs.tree.getCheckedKeys().concat(this.$refs.tree.getHalfCheckedKeys());
+            this.form.dataScopeDeptIds = ids.join(',');
+          }
           const saveOrUpdate = this.isUpdate ? putRoles : addRole;
           saveOrUpdate(this.form)
             .then((msg) => {
@@ -152,6 +206,13 @@
             // this.$util.assignObject(this.form, this.data);
             // this.form = this.data;
             this.form = Object.assign(this.data);
+            this.form.dataScope = this.form.dataScope + ''
+            this.$nextTick(()=>{
+              if(this.form.dataScope=='2'){
+                this.$refs.tree.setCheckedKeys(this.form.dataScopeDeptIds.split(','))
+              }
+
+            })
             this.isUpdate = true;
           } else {
             this.isUpdate = false;

+ 1 - 1
vue.config.js

@@ -33,7 +33,7 @@ module.exports = {
       '/api': {
         // target: 'http://124.71.68.31:50001',
         // target: 'http://192.168.1.147:18086',
-        target: 'http://192.168.1.116:18086',
+        target: 'http://192.168.1.147:18086',
         changeOrigin: true, // 只有这个值为true的情况下 才表示开启跨域
         pathRewrite: {
           '^/api': ''