UserAdd.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. <template>
  2. <el-drawer
  3. v-model="visible"
  4. :title="editor ? t('Label.EditorUser') : t('Label.AddUser')"
  5. size="650"
  6. @close="close"
  7. >
  8. <el-form ref="formRef" :rules="rules" :model="form" label-width="150PX">
  9. <el-form-item :label="$t('Label.UserNames') + ':'">
  10. <el-input v-model.trim="form.username" :placeholder="$t('Placeholder.Input')"></el-input>
  11. </el-form-item>
  12. <el-form-item :label="$t('Label.Name') + ':'">
  13. <el-input v-model="form.name" :placeholder="$t('Placeholder.Input')"></el-input>
  14. </el-form-item>
  15. <el-form-item :label="$t('Label.Email') + ':'">
  16. <el-input v-model.trim="form.email" :placeholder="$t('Placeholder.Input')"></el-input>
  17. </el-form-item>
  18. <!-- <el-form-item :label="$t('Label.Phone') + ':'">-->
  19. <!-- <el-input v-model.trim="form.phone" :placeholder="$t('Placeholder.Input')"></el-input>-->
  20. <!-- </el-form-item>-->
  21. <el-form-item :label="$t('Label.Pwd') + ':'">
  22. <el-input v-model.trim="form.password"></el-input>
  23. </el-form-item>
  24. <el-form-item :label="$t('Label.RoleName') + ':'">
  25. <el-select
  26. v-model="form.roleId"
  27. class="crm_search_down"
  28. :placeholder="$t('Placeholder.Choose')"
  29. >
  30. <el-option
  31. v-for="(item, index) in roleName"
  32. :key="index"
  33. :label="item.name"
  34. :value="item.id"
  35. ></el-option>
  36. </el-select>
  37. </el-form-item>
  38. <el-form-item v-if="form.departmentId == '1'" :label="$t('Label.SalesSupervisor') + ':'">
  39. <el-select
  40. v-model="form.pid"
  41. class="crm_search_down"
  42. filterable
  43. :placeholder="$t('Placeholder.Choose')"
  44. @change="selectChange"
  45. >
  46. <el-option
  47. v-for="(item, index) in userSales"
  48. :key="index"
  49. :label="item.name + '(' + item.ibNo + ')'"
  50. :value="item.id"
  51. ></el-option>
  52. </el-select>
  53. </el-form-item>
  54. <el-form-item
  55. v-if="form.departmentId == '1'"
  56. :label="$t('salaryPerformance.salary.item1') + ':'"
  57. >
  58. <el-select
  59. v-model="form.salesType"
  60. class="crm_search_down"
  61. filterable
  62. :placeholder="$t('Placeholder.Choose')"
  63. @change="selectChangesalesType"
  64. >
  65. <el-option :label="$t('salaryPerformance.salary.item2')" :value="1"></el-option>
  66. <el-option :label="$t('salaryPerformance.salary.item3')" :value="2"></el-option>
  67. </el-select>
  68. </el-form-item>
  69. <el-form-item
  70. v-if="form.departmentId == '1'"
  71. :label="$t('salaryPerformance.salary.item3') + ':'"
  72. >
  73. <el-select
  74. v-model="form.leaderId"
  75. class="crm_search_down"
  76. filterable
  77. :placeholder="$t('Placeholder.Choose')"
  78. @change="selectChange"
  79. >
  80. <el-option
  81. v-for="(item, index) in userSales"
  82. :key="index"
  83. :label="item.name + '(' + item.ibNo + ')'"
  84. :value="item.id"
  85. ></el-option>
  86. </el-select>
  87. </el-form-item>
  88. <el-form-item
  89. v-if="form.departmentId == '1'"
  90. :label="$t('salaryPerformance.salary.item4') + ':'"
  91. >
  92. <el-select
  93. v-model="form.salesCommissionRuleId"
  94. class="crm_search_down"
  95. filterable
  96. clearable
  97. :placeholder="$t('Placeholder.Choose')"
  98. @change="selectChange"
  99. >
  100. <el-option
  101. v-for="(item, index) in GetRuleDropdownList"
  102. :key="index"
  103. :label="item.ruleName + '(' + item.kpiStandardName + ')'"
  104. :value="item.id"
  105. ></el-option>
  106. </el-select>
  107. </el-form-item>
  108. <el-form-item
  109. v-if="form.departmentId == '1'"
  110. :label="$t('salaryPerformance.salary.item5') + ':'"
  111. >
  112. <el-input v-model.trim="form.salaryLogin" :placeholder="$t('Placeholder.Input')"></el-input>
  113. </el-form-item>
  114. <el-form-item
  115. v-if="form.departmentId == '1'"
  116. prop="salaryPlatform"
  117. :label="$t('salaryPerformance.salary.item6') + ':'"
  118. >
  119. <el-select
  120. v-model="form.salaryPlatform"
  121. class="crm_search_down"
  122. filterable
  123. :placeholder="$t('Placeholder.Choose')"
  124. @change="selectChange"
  125. >
  126. <el-option label="MT4" value="MT4"></el-option>
  127. <el-option label="MT5" value="MT5"></el-option>
  128. </el-select>
  129. </el-form-item>
  130. <el-form-item :label="$t('Label.Region') + ':'">
  131. <el-select
  132. v-model="form.groupId"
  133. class="crm_search_down"
  134. :placeholder="$t('Placeholder.Choose')"
  135. >
  136. <el-option
  137. v-for="(item, index) in GetState"
  138. :key="index"
  139. :label="Session.Get('lang') == 'cn' ? item.name : item.enName"
  140. :value="item.id"
  141. ></el-option>
  142. </el-select>
  143. </el-form-item>
  144. <el-form-item :label="$t('Label.Nationality') + ':'">
  145. <el-select
  146. v-model="form.country"
  147. class="crm_search_down"
  148. filterable
  149. remote
  150. :placeholder="$t('Placeholder.Choose')"
  151. >
  152. <el-option
  153. v-for="(item, index) in mock_options"
  154. :key="index"
  155. :label="item.enName"
  156. :value="item.code"
  157. ></el-option>
  158. </el-select>
  159. </el-form-item>
  160. <el-form-item prop="areaId" :label="$t('Area.item1') + ':'">
  161. <el-select
  162. v-model="form.areaId"
  163. class="crm_search_down"
  164. :placeholder="$t('Placeholder.Choose')"
  165. >
  166. <el-option
  167. v-for="(item, index) in GetArea"
  168. :key="index"
  169. :label="item.name"
  170. :value="item.id"
  171. ></el-option>
  172. </el-select>
  173. </el-form-item>
  174. <!-- <el-form-item :label="$t('Label.Code') + ':'">-->
  175. <!-- <el-input v-model.trim="form.ibNo" :placeholder="$t('Placeholder.Input')"></el-input>-->
  176. <!-- </el-form-item>-->
  177. <!-- <el-form-item :label="$t('Label.ibNoTemp') + ':'">
  178. <el-input
  179. v-model.trim="form.ibNoTemp"
  180. :placeholder="$t('Placeholder.Input')"
  181. ></el-input>
  182. </el-form-item> -->
  183. <el-form-item v-if="!editor" :label="$t('Enter_info.GroupEmail') + ':'">
  184. <el-select
  185. v-model="form.groupEmail"
  186. class="crm_search_down"
  187. :placeholder="$t('Placeholder.Choose')"
  188. >
  189. <el-option
  190. v-for="(item, index) in groupEmailList"
  191. :key="index"
  192. :label="item.groupName"
  193. :value="item.groupEmail"
  194. ></el-option>
  195. </el-select>
  196. </el-form-item>
  197. <el-form-item prop="entryDate" :label="$t('Label.entryDate') + ':'">
  198. <el-date-picker
  199. v-model="form.entryDate"
  200. type="date"
  201. class="crm_search_down"
  202. value-format="YYYY-MM-DD"
  203. :placeholder="$t('Placeholder.Input')"
  204. >
  205. </el-date-picker>
  206. </el-form-item>
  207. <el-form-item prop="pid" :label="$t('Label.SalesSupervisor1') + ':'">
  208. <el-select
  209. v-model="form.attachId"
  210. class="crm_search_down"
  211. filterable
  212. :placeholder="$t('Placeholder.Choose')"
  213. >
  214. <el-option
  215. v-for="(item, index) in userSales"
  216. :key="index"
  217. :label="item.name + '(' + item.ibNo + ')'"
  218. :value="item.id"
  219. ></el-option>
  220. </el-select>
  221. </el-form-item>
  222. <el-form-item prop="entryStatus" :label="$t('Label.EmploymentStatus') + ':'">
  223. <el-select
  224. v-model="form.entryStatus"
  225. class="crm_search_down"
  226. :placeholder="$t('Placeholder.Choose')"
  227. >
  228. <el-option :label="$t('State.employmentStatus1')" :value="1"></el-option>
  229. <el-option :label="$t('State.employmentStatus2')" :value="2"></el-option>
  230. </el-select>
  231. </el-form-item>
  232. <el-form-item :label="$t('Label.Merchant') + ':'">
  233. <el-switch
  234. v-model="form.isMerchantRole"
  235. class="crm_switch"
  236. :active-value="1"
  237. :inactive-value="0"
  238. :active-text="$t('Btn.Yes')"
  239. :inactive-text="$t('Btn.No')"
  240. active-color="#368FEC"
  241. inactive-color="#EB3F57"
  242. >
  243. </el-switch>
  244. </el-form-item>
  245. <el-form-item :label="$t('Label.LoginState') + ':'">
  246. <el-switch
  247. v-model="form.valid"
  248. class="crm_switch"
  249. :active-value="1"
  250. :inactive-value="0"
  251. :active-text="$t('Btn.Yes')"
  252. :inactive-text="$t('Btn.No')"
  253. active-color="#368FEC"
  254. inactive-color="#EB3F57"
  255. >
  256. </el-switch>
  257. </el-form-item>
  258. <el-form-item :label="$t('Label.IpLimit') + ':'">
  259. <el-switch
  260. v-model="form.ipLimit"
  261. class="crm_switch"
  262. :active-value="1"
  263. :inactive-value="0"
  264. :active-text="$t('Btn.Yes')"
  265. :inactive-text="$t('Btn.No')"
  266. active-color="#368FEC"
  267. inactive-color="#EB3F57"
  268. >
  269. </el-switch>
  270. </el-form-item>
  271. <el-form-item v-show="form.ipLimit" :label="$t('Label.limitIp') + ':'">
  272. <el-input v-model.trim="form.limitIp" :placeholder="$t('Placeholder.Input')"></el-input>
  273. </el-form-item>
  274. </el-form>
  275. <template #footer>
  276. <el-button type="primary" @click="confirm">{{ $t('Btn.Confirm') }}</el-button>
  277. </template>
  278. </el-drawer>
  279. </template>
  280. <script setup lang="ts">
  281. import { ref, reactive, computed, watch, onMounted, inject } from 'vue'
  282. import { useI18n } from 'vue-i18n'
  283. import type { FormInstance, FormRules } from 'element-plus'
  284. import ServiceSalary from '@/service/salaryPerformance'
  285. import ServiceMarket from '@/service/marketing'
  286. import ServiceUser from '@/service/user'
  287. import Config from '@/config/index'
  288. const { Code } = Config
  289. const { t } = useI18n()
  290. const Session = inject('session')
  291. const pigeon = inject('pigeon')
  292. interface Props {
  293. dialogInfoTradingAdd: boolean
  294. editor?: string
  295. myInfo?: any
  296. formList?: any
  297. }
  298. const props = withDefaults(defineProps<Props>(), {
  299. dialogInfoTradingAdd: false,
  300. editor: '',
  301. myInfo: null,
  302. formList: null,
  303. })
  304. const emit = defineEmits<{
  305. (e: 'update:dialogInfoTradingAdd', value: boolean): void
  306. (e: 'confirmToReload'): void
  307. (e: 'close'): void
  308. }>()
  309. // Refs
  310. const formRef = ref<FormInstance>()
  311. const visible = ref(props.dialogInfoTradingAdd)
  312. // Reactive data
  313. const form = reactive({})
  314. const roleName = ref([])
  315. const userSales = ref([])
  316. const GetRuleDropdownList = ref([])
  317. const GetRuleDropdown = ref([])
  318. const GetState = ref([])
  319. const GetArea = ref([])
  320. const mock_options = ref([])
  321. const groupEmailList = ref([])
  322. const rules = ref<FormRules>({
  323. areaId: [
  324. {
  325. required: true,
  326. message: t('Placeholder.Choose'),
  327. trigger: 'change',
  328. },
  329. ],
  330. })
  331. // Computed
  332. const GetRuleDropdownListComputed = computed(() => {
  333. return GetRuleDropdown.value.filter((item: any) => item.salesType == form.salesType)
  334. })
  335. const role_system = computed(() => {
  336. const user = JSON.parse(Session.Get('user', true) || '{}')
  337. return user.departmentId == null && user.roleName == 'ROLE_SYSTEM'
  338. })
  339. // Methods
  340. const selectChangesalesType = (val: number) => {
  341. form.salesCommissionRuleId = null
  342. GetRuleDropdownList.value = GetRuleDropdown.value.filter((item: any) => item.salesType == val)
  343. }
  344. const getRoleList = async () => {
  345. let res = await ServiceUser.roleNameList({})
  346. if (res.code == Code.StatusOK) {
  347. roleName.value = res.data
  348. } else {
  349. pigeon.MessageError(res.msg)
  350. }
  351. }
  352. // 获取邮箱组别列表
  353. const getGroupEmailList = async () => {
  354. try {
  355. let res = await ServiceUser.getGroupEmailList({})
  356. if (res.code == Code.StatusOK) {
  357. groupEmailList.value = res.data
  358. } else {
  359. // 使用 Element Plus 的消息提示或其他消息组件
  360. pigeon.MessageError(res.msg || t('Msg.Error'))
  361. }
  362. } catch (error) {
  363. console.error('获取邮箱组别列表失败:', error)
  364. pigeon.MessageError(t('Msg.NetworkError'))
  365. }
  366. }
  367. // 获取销售主管列表
  368. const getRoleSuperiorList = async () => {
  369. try {
  370. let res = await ServiceUser.userSales({})
  371. if (res.code == Code.StatusOK) {
  372. userSales.value = res.data
  373. } else {
  374. pigeon.MessageError(res.msg || t('Msg.Error'))
  375. }
  376. } catch (error) {
  377. console.error('获取销售主管列表失败:', error)
  378. pigeon.MessageError(t('Msg.NetworkError'))
  379. }
  380. }
  381. // 获取薪资绩效规则下拉
  382. const getsalesCommissionRuleDropdown = async () => {
  383. let res = await ServiceSalary.salesCommissionRuleDropdown({})
  384. if (res.code == Code.StatusOK) {
  385. GetRuleDropdown.value = res.data
  386. form.salesType = Number(form.salesType) || null
  387. GetRuleDropdownList.value = GetRuleDropdown.value.filter(
  388. (item: any) => item.salesType == form.salesType
  389. )
  390. } else {
  391. pigeon.MessageError(res.msg)
  392. }
  393. }
  394. // 获取角色地区信息
  395. const getDepartmentState = async () => {
  396. try {
  397. let res = await ServiceUser.userGroupGet({})
  398. if (res.code == Code.StatusOK) {
  399. GetState.value = res.data
  400. } else {
  401. pigeon.MessageError(res.msg || t('Msg.Error'))
  402. }
  403. } catch (error) {
  404. console.error('获取角色地区信息失败:', error)
  405. pigeon.MessageError(t('Msg.NetworkError'))
  406. }
  407. }
  408. // 获取角色区域信息
  409. const getArealListUP = async () => {
  410. try {
  411. let res = await ServiceUser.arealListUP({})
  412. if (res.code == Code.StatusOK) {
  413. GetArea.value = res.data
  414. } else {
  415. pigeon.MessageError(res.msg || t('Msg.Error'))
  416. }
  417. } catch (error) {
  418. console.error('获取角色区域信息失败:', error)
  419. pigeon.MessageError(t('Msg.NetworkError'))
  420. }
  421. }
  422. // 获取国家列表
  423. const getCountry = async () => {
  424. try {
  425. let res = await ServiceMarket.Country({})
  426. if (res.code == Code.StatusOK) {
  427. mock_options.value = res.data
  428. } else {
  429. pigeon.MessageError(res.msg || t('Msg.Error'))
  430. }
  431. } catch (error) {
  432. console.error('获取国家列表失败:', error)
  433. pigeon.MessageError(t('Msg.NetworkError'))
  434. }
  435. }
  436. // 提交
  437. const confirm = () => {
  438. if (!formRef.value) return
  439. formRef.value.validate((valid) => {
  440. if (valid) {
  441. toConfirm()
  442. } else {
  443. return false
  444. }
  445. })
  446. }
  447. const toConfirm = () => {
  448. if (props.editor) {
  449. userUpdate()
  450. } else {
  451. userAdd()
  452. }
  453. }
  454. // 用户update
  455. const userUpdate = async () => {
  456. if (form.departmentId != 1) {
  457. form.pid = null
  458. form.salesType = null
  459. form.salesCommissionRuleId = null
  460. form.leaderId = null
  461. form.salaryLogin = null
  462. form.salaryPlatform = null
  463. }
  464. if (!form.ipLimit) {
  465. form.limitIp = null
  466. }
  467. let res = await ServiceUser.userListUpdate({
  468. ...form,
  469. })
  470. if (res.code == Code.StatusOK) {
  471. emit('confirmToReload')
  472. close()
  473. formRef.value?.resetFields()
  474. // 使用 $pigeon 的替代方式
  475. console.log(t('Msg.Success'))
  476. } else {
  477. console.error(res.msg)
  478. }
  479. }
  480. // 用户add
  481. const userAdd = async () => {
  482. if (form.departmentId != 1) {
  483. form.pid = null
  484. form.salesType = null
  485. form.salesCommissionRuleId = null
  486. form.leaderId = null
  487. form.salaryLogin = null
  488. form.salaryPlatform = null
  489. }
  490. if (!form.ipLimit) {
  491. form.limitIp = null
  492. }
  493. let res = await ServiceUser.userListAdd({
  494. ...form,
  495. })
  496. if (res.code == Code.StatusOK) {
  497. emit('confirmToReload')
  498. formRef.value?.resetFields()
  499. console.log(t('Msg.Success'))
  500. } else {
  501. console.error(res.msg)
  502. }
  503. }
  504. const close = () => {
  505. emit('update:dialogInfoTradingAdd', false)
  506. emit('close')
  507. }
  508. const selectChange = () => {
  509. // 选择变更处理
  510. }
  511. // Lifecycle
  512. onMounted(() => {
  513. // 初始化数据
  514. // getsalesCommissionRuleDropdown()
  515. })
  516. // Watch
  517. watch(
  518. () => props.formList,
  519. (newVal) => {
  520. if (newVal) {
  521. Object.assign(form, newVal)
  522. }
  523. },
  524. { immediate: true }
  525. )
  526. // Watch
  527. watch(
  528. () => props.dialogInfoTradingAdd,
  529. (newVal) => {
  530. visible.value = newVal
  531. if (!newVal && formRef.value) {
  532. formRef.value?.resetFields()
  533. Object.keys(form).forEach((key) => (form[key] = ''))
  534. }
  535. if (newVal) {
  536. getDepartmentState()
  537. getArealListUP()
  538. getCountry()
  539. getRoleList()
  540. getRoleSuperiorList()
  541. getsalesCommissionRuleDropdown()
  542. getGroupEmailList()
  543. if (!form.entryStatus) {
  544. Object.assign(form, { entryStatus: 1 })
  545. }
  546. }
  547. },
  548. { immediate: true }
  549. )
  550. </script>
  551. <style scoped lang="scss"></style>