DeptForm.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <template>
  2. <Dialog v-model="dialogVisible" :title="dialogTitle">
  3. <el-form
  4. ref="formRef"
  5. v-loading="formLoading"
  6. :model="formData"
  7. :rules="formRules"
  8. label-width="100px"
  9. >
  10. <el-form-item label="上级部门" prop="parentId">
  11. <el-tree-select
  12. v-model="formData.parentId"
  13. :data="deptTree"
  14. :props="defaultProps"
  15. check-strictly
  16. default-expand-all
  17. placeholder="请选择上级部门"
  18. value-key="deptId"
  19. />
  20. </el-form-item>
  21. <el-form-item label="部门名称" prop="name">
  22. <!-- <el-input v-model="formData.name" placeholder="请输入部门名称" />-->
  23. <lang-input v-model="formData.name" placeholder="请输入部门名称" />
  24. </el-form-item>
  25. <el-form-item label="显示排序" prop="sort">
  26. <el-input-number v-model="formData.sort" :min="0" controls-position="right" />
  27. </el-form-item>
  28. <el-form-item label="类型" prop="type">
  29. <el-select v-model="formData.type" clearable placeholder="请选择类型">
  30. <el-option
  31. v-for="dict in getStrDictOptions(DICT_TYPE.DEPT_TYPE)"
  32. :key="dict.value"
  33. :label="dict.label"
  34. :value="dict.value"
  35. />
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item label="负责人" prop="leaderUserId">
  39. <el-select v-model="formData.leaderUserId" clearable placeholder="请输入负责人">
  40. <el-option
  41. v-for="item in userList"
  42. :key="item.id"
  43. :label="item.nickname"
  44. :value="item.id"
  45. />
  46. </el-select>
  47. </el-form-item>
  48. <!--
  49. <el-form-item label="联系电话" prop="phone">
  50. <el-input v-model="formData.phone" maxlength="11" placeholder="请输入联系电话" />
  51. </el-form-item>
  52. <el-form-item label="邮箱" prop="email">
  53. <el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" />
  54. </el-form-item>
  55. -->
  56. <el-form-item label="SAP工厂">
  57. <el-select v-model="formData.factoryIds" multiple placeholder="请选择" @change="selectedFactoryChange" filterable clearable>
  58. <el-option
  59. v-for="item in factoryList"
  60. :key="item.id"
  61. :label="item.factoryName"
  62. :value="item.id!"
  63. />
  64. </el-select>
  65. </el-form-item>
  66. <el-form-item label="SAP成本中心">
  67. <el-select v-model="formData.costCenterIds" multiple placeholder="请选择" filterable clearable>
  68. <el-option
  69. v-for="item in costCenterList"
  70. :key="item.id"
  71. :label="item.costCenterName"
  72. :value="item.id!"
  73. />
  74. </el-select>
  75. </el-form-item>
  76. <el-form-item label="SAP库存地点">
  77. <el-select v-model="formData.stockLocationIds" multiple placeholder="请选择" filterable clearable>
  78. <el-option
  79. v-for="item in stockLocationList"
  80. :key="item.id"
  81. :label="item.storageLocationName"
  82. :value="item.id!"
  83. />
  84. </el-select>
  85. </el-form-item>
  86. <el-form-item label="状态" prop="status">
  87. <el-select v-model="formData.status" clearable placeholder="请选择状态">
  88. <el-option
  89. v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
  90. :key="dict.value"
  91. :label="dict.label"
  92. :value="dict.value"
  93. />
  94. </el-select>
  95. </el-form-item>
  96. </el-form>
  97. <template #footer>
  98. <el-button type="primary" @click="submitForm">确 定</el-button>
  99. <el-button @click="dialogVisible = false">取 消</el-button>
  100. </template>
  101. </Dialog>
  102. </template>
  103. <script lang="ts" setup>
  104. import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from '@/utils/dict'
  105. import {defaultProps, handleTree} from '@/utils/tree'
  106. import * as DeptApi from '@/api/system/dept'
  107. import * as UserApi from '@/api/system/user'
  108. import {CommonStatusEnum} from '@/utils/constants'
  109. import {FormRules} from 'element-plus'
  110. import {IotTreeApi} from '@/api/system/tree'
  111. import * as SapOrgApi from "@/api/system/saporg";
  112. import { toRaw } from "vue";
  113. import { useTableStore } from '@/store/modules/tableStore'
  114. defineOptions({ name: 'SystemDeptForm' })
  115. const { t } = useI18n() // 国际化
  116. const message = useMessage() // 消息弹窗
  117. const tableStore = useTableStore();
  118. const dialogVisible = ref(false) // 弹窗的是否展示
  119. const dialogTitle = ref('') // 弹窗的标题
  120. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  121. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  122. const selectedDeptId = ref(null); // 通过 tableStore 存储的 table 行记录 id 由父组件传递过来
  123. const formData = ref({
  124. id: undefined,
  125. title: '',
  126. parentId: selectedDeptId.value,
  127. type: undefined,
  128. name: undefined,
  129. sort: 0,
  130. leaderUserId: undefined,
  131. phone: undefined,
  132. email: undefined,
  133. factoryIds: [],
  134. costCenterIds: [],
  135. stockLocationIds: [],
  136. status: CommonStatusEnum.ENABLE
  137. })
  138. const selectedFactoryReqVO = ref({
  139. type: 0, // 类型(1工厂 2成本中心 3库位)
  140. factoryCodes: [] // 已经选择的SAP工厂code 列表
  141. })
  142. const formRules = reactive<FormRules>({
  143. parentId: [{ required: true, message: '上级部门不能为空', trigger: 'blur' }],
  144. name: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
  145. sort: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }],
  146. // email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
  147. phone: [
  148. { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
  149. ],
  150. status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
  151. })
  152. const formRef = ref() // 表单 Ref
  153. const deptTree = ref() // 树形结构
  154. const userList = ref<UserApi.UserVO[]>([]) // 用户列表
  155. const factoryList = ref([] as SapOrgApi.SapOrgVO[]) // SAP工厂列表
  156. const costCenterList = ref([] as SapOrgApi.SapOrgVO[]) // SAP成本中心列表
  157. const stockLocationList = ref([] as SapOrgApi.SapOrgVO[]) // SAP库存地点列表
  158. const selectedFactoryCodes = ref([]) // 选择的SAP工厂 code 列表
  159. /** 打开弹窗 */
  160. const open = async (type: string, id?: number) => {
  161. dialogVisible.value = true
  162. // 获取 tableStore 中的 已经选中的 行记录id
  163. selectedDeptId.value = tableStore.selectedId;
  164. dialogTitle.value = t('action.' + type)
  165. formType.value = type
  166. resetForm()
  167. // 修改时,设置数据
  168. if (id) {
  169. formLoading.value = true
  170. try {
  171. formData.value = await DeptApi.getDept(id)
  172. } finally {
  173. formLoading.value = false
  174. }
  175. }
  176. // 获得用户列表
  177. userList.value = await UserApi.getSimpleUserList()
  178. // 获得部门树
  179. await getTree()
  180. // 加载工厂(SAP)列表
  181. factoryList.value = await SapOrgApi.SapOrgApi.getSimpleSapOrgList(1)
  182. // costCenterList.value = await SapOrgApi.SapOrgApi.getSimpleSapOrgList(2)
  183. // stockLocationList.value = await SapOrgApi.SapOrgApi.getSimpleSapOrgList(3)
  184. // 根据已有的SAP工厂值 获取 factoryCode数组
  185. if (formData.value.factoryIds === null) {
  186. return;
  187. }
  188. selectedFactoryCodes.value = formData.value.factoryIds.map(id => {
  189. const factory = factoryList.value.find(item => item.id === id)
  190. return factory ? factory.factoryCode : null
  191. }).filter(code => code !== null)
  192. // console.log(JSON.stringify(toRaw(selectedFactoryCodes.value)))
  193. // 根据SAP工厂已有值 加载成本中心(SAP)列表
  194. selectedFactoryReqVO.value.type = 2
  195. selectedFactoryReqVO.value.factoryCodes = toRaw(selectedFactoryCodes.value)
  196. costCenterList.value = await SapOrgApi.SapOrgApi.getSelectedList(selectedFactoryReqVO.value)
  197. // 根据SAP工厂已有值 加载库存地点(SAP)列表
  198. selectedFactoryReqVO.value.type = 3
  199. selectedFactoryReqVO.value.factoryCodes = toRaw(selectedFactoryCodes.value)
  200. stockLocationList.value = await SapOrgApi.SapOrgApi.getSelectedList(selectedFactoryReqVO.value)
  201. }
  202. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  203. /** 提交表单 */
  204. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  205. const submitForm = async () => {
  206. // 校验表单
  207. if (!formRef) return
  208. const valid = await formRef.value.validate()
  209. if (!valid) return
  210. // 提交请求
  211. formLoading.value = true
  212. try {
  213. const data = formData.value as unknown as DeptApi.DeptVO
  214. if (formType.value === 'create') {
  215. await DeptApi.createDept(data).then(res => {
  216. DeptApi.getDept(res).then(re => {
  217. console.log(JSON.stringify(re))
  218. IotTreeApi.createDeptDeal(re)
  219. })
  220. })
  221. message.success(t('common.createSuccess'))
  222. } else {
  223. await DeptApi.updateDept(data).then(res => {
  224. DeptApi.getDept(data.id).then(re => {
  225. IotTreeApi.updateDeptDeal(re)
  226. })
  227. })
  228. message.success(t('common.updateSuccess'))
  229. }
  230. dialogVisible.value = false
  231. // 发送操作成功的事件
  232. emit('success')
  233. } finally {
  234. formLoading.value = false
  235. }
  236. }
  237. /** 已经选择了 SAP工厂 */
  238. const selectedFactoryChange = async (selectedIds) => {
  239. // 获取选中的factoryCode数组
  240. const selectedFactoryCodes = selectedIds.map(id => {
  241. const factory = factoryList.value.find(item => item.id === id)
  242. return factory ? factory.factoryCode : null
  243. }).filter(code => code !== null)
  244. // 获得已经选择的 SAP 工厂 数组
  245. // const factoryIds = formData.value.factoryIds
  246. // 调用后台接口查询 SAP工厂下属的 成本中心列表
  247. selectedFactoryReqVO.value.type = 2
  248. selectedFactoryReqVO.value.factoryCodes = selectedFactoryCodes
  249. costCenterList.value = await SapOrgApi.SapOrgApi.getSelectedList(selectedFactoryReqVO.value)
  250. // 根据选择的 SAP工厂 调用后台接口查询 SAP工厂下属的 库存地点列表
  251. selectedFactoryReqVO.value.type = 3
  252. selectedFactoryReqVO.value.factoryCodes = selectedFactoryCodes
  253. stockLocationList.value = await SapOrgApi.SapOrgApi.getSelectedList(selectedFactoryReqVO.value)
  254. }
  255. /** 重置表单 */
  256. const resetForm = () => {
  257. formData.value = {
  258. id: undefined,
  259. title: '',
  260. parentId: selectedDeptId.value,
  261. name: undefined,
  262. sort: 0,
  263. leaderUserId: undefined,
  264. phone: undefined,
  265. email: undefined,
  266. factoryIds: [],
  267. costCenterIds: [],
  268. stockLocationIds: [],
  269. status: CommonStatusEnum.ENABLE
  270. }
  271. formRef.value?.resetFields()
  272. }
  273. /** 获得部门树 */
  274. const getTree = async () => {
  275. deptTree.value = []
  276. const data = await DeptApi.getSimpleDeptList()
  277. let dept: Tree = { id: 0, name: '顶级部门', children: [] }
  278. dept.children = handleTree(data)
  279. deptTree.value.push(dept)
  280. }
  281. /** 初始化 **/
  282. onMounted(() => {
  283. formData.value.sort = 0
  284. })
  285. </script>