edit.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. <template>
  2. <div>
  3. <el-button type="default" size="mini" @click="onShow">{{$t('编 辑')}}</el-button>
  4. <el-drawer :title="$t(`编辑员工`)" direction="rtl" append-to-body :visible.sync="dialogFormVisible" size="800px" @close="$refs.form.clearValidate()" :show-close="false" :wrapperClosable="false">
  5. <div class="drawer__panel">
  6. <el-row :gutter="20">
  7. <el-form :model="form" size="small" :rules="rules" ref="form" label-position="right" :label-width="tool.onlyZh('100px')">
  8. <el-row>
  9. <el-col :span="24">
  10. <el-form-item :label="$t(`编号`)+':'" prop="hrcode">
  11. <el-input v-model="form.hrcode" :placeholder="$t(`编号`)" autocomplete="off"></el-input>
  12. </el-form-item>
  13. </el-col>
  14. <el-col :span="24">
  15. <el-form-item :label="$t(`性别`)">
  16. <el-select v-model="form.sex" style="width:100%" :placeholder="$t('请选择')">
  17. <el-option
  18. v-for="item in sys_options"
  19. :key="item.index"
  20. :label="$t(item.value)"
  21. :value="item.value">
  22. </el-option>
  23. </el-select>
  24. </el-form-item>
  25. </el-col>
  26. <el-col :span="24">
  27. <el-form-item :label="$t(`姓名`)+':'" prop="name">
  28. <el-input v-model="form.name" :placeholder="$t(`姓名`)" autocomplete="off"></el-input>
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="24">
  32. <el-form-item :label="$t(`电子邮箱`)+':'" prop="email">
  33. <el-input v-model="form.email" :placeholder="$t(`电子邮箱`)" autocomplete="off"></el-input>
  34. </el-form-item>
  35. </el-col>
  36. <el-col :span="24">
  37. <el-form-item :label="$t(`身份证号`)+':'">
  38. <el-input v-model="form.idcard" :placeholder="$t(`身份证号`)" autocomplete="off"></el-input>
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="24">
  42. <el-form-item :label="$t(`部门`)+':'" prop="depname">
  43. <el-popover
  44. placement="bottom"
  45. width="400"
  46. trigger="click"
  47. v-model="visible">
  48. <el-tree
  49. :data="deplist"
  50. node-key="id"
  51. default-expand-all
  52. highlight-current
  53. :expand-on-click-node="false"
  54. @node-click="nodeClick"
  55. >
  56. <span class="custom-tree-node" slot-scope="{ node, data }">
  57. <span>{{ node.label }}</span>
  58. </span>
  59. </el-tree>
  60. <el-input slot="reference" v-model="form.depname" readonly :placeholder="$t('请选择')" autocomplete="off"></el-input>
  61. </el-popover>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="24">
  65. <el-form-item :label="$t(`办公电话`)+':'">
  66. <el-input v-model="form.officetelephone" :placeholder="$t(`办公电话`)" autocomplete="off"></el-input>
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="24">
  70. <el-form-item :label="$t(`职位`)+':'">
  71. <el-input v-model="form.position" :placeholder="$t(`职位`)" autocomplete="off"></el-input>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="24">
  75. <el-form-item :label="$t(`汇报对象`)+':'">
  76. <selectMenber :reporthrname="form.reporthrname" @selectMenber="selectMenber" @clearMenber="form.reporthrname = '';form.reporthrid = ''"></selectMenber>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="12" >
  80. <el-form-item :label="$t(`状态`)+':'">
  81. <el-radio-group v-model="form.status">
  82. <el-radio label="0">{{ $t('在职') }}</el-radio>
  83. <el-radio label="1">{{ $t('离职') }}</el-radio>
  84. </el-radio-group>
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="12" >
  88. <el-form-item :label="$t(`员工属性`)+':'">
  89. <el-radio-group v-model="form.type">
  90. <el-radio :label="0">{{ $t('正式') }}</el-radio>
  91. <el-radio :label="1">{{ $t('兼职') }}</el-radio>
  92. </el-radio-group>
  93. </el-form-item>
  94. </el-col>
  95. </el-row>
  96. <el-row>
  97. <el-col :span="5" style="height:51px">
  98. <el-form-item>
  99. <el-checkbox v-model="form.isleader" :false-label="0" :true-label="1">{{ $t('是否部门负责人') }}</el-checkbox>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="5">
  103. <el-form-item>
  104. <el-checkbox v-model="form.isworker" :false-label="0" :true-label="1">{{ $t('是否服务人员') }}</el-checkbox>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="5">
  108. <el-form-item>
  109. <el-checkbox v-model="form.isuppictured" :false-label="0" :true-label="1">{{ $t('是否上图员') }}</el-checkbox>
  110. </el-form-item>
  111. </el-col>
  112. <el-col :span="5">
  113. <el-form-item>
  114. <el-checkbox v-model="form.issalehr" :false-label="0" :true-label="1" disabled>{{ $t('是否业务员') }}</el-checkbox>
  115. </el-form-item>
  116. </el-col>
  117. </el-row>
  118. <el-row v-if="form.issalehr == '1'">
  119. <el-col :span="24">
  120. <el-form-item :label="$t('业务员')" style="font-weight: bold">
  121. <addSalers :name="form.name" @salerInfo="salerInfo" :data="salerList"></addSalers>
  122. </el-form-item>
  123. </el-col>
  124. </el-row>
  125. <el-row v-if="form.issalehr == '1'">
  126. <el-col :span="23" :offset="1">
  127. <tableNewLayout :layout="tablecols" :data="salerList" :opwidth="200" height="450px" :width="true" :custom="true" fixedName="operation">
  128. <template v-slot:customcol="scope">
  129. <p v-if="scope.column.columnname == 'iseditprice '">
  130. {{scope.column.data.iseditprice == '1' ? $t('是'):$t('否') }}
  131. </p>
  132. <p v-else>{{$t(scope.column.data[scope.column.columnname])}}</p>
  133. </template>
  134. <template v-slot:opreation="scope">
  135. <el-button type="text" disabled>{{$t('删 除')}}</el-button>
  136. </template>
  137. </tableNewLayout>
  138. </el-col>
  139. </el-row>
  140. </el-form>
  141. </el-row>
  142. </div>
  143. <div class="fixed__btn__panel">
  144. <el-button size="small" @click="dialogFormVisible = false" class="normal-btn-width">{{$t('取 消')}}</el-button>
  145. <el-button size="small" type="primary" @click="onSubmit" class="normal-btn-width">{{$t('确 定')}}</el-button>
  146. </div>
  147. </el-drawer>
  148. </div>
  149. </template>
  150. <script>
  151. import {mapGetters} from 'vuex'
  152. import selectMenber from '@/components/selectMenber/index.vue'
  153. import areaList from "@/HManagement/marketing2/saler/area/modules/areaList";
  154. import addSalers from "@/HManagement/department/staff/list/modules/addSalers";
  155. export default {
  156. components:{
  157. selectMenber,
  158. areaList,
  159. addSalers
  160. },
  161. computed:{
  162. ...mapGetters({
  163. sys_options:'sys_options'
  164. })
  165. },
  166. data () {
  167. return {
  168. dialogFormVisible:false,
  169. visible:false,
  170. rules:{
  171. hrcode: [
  172. { required: true, message: this.$t('请输入员工编码'), trigger: 'blur' },
  173. ],
  174. name: [
  175. { required: true, message: this.$t('请输入员工姓名'), trigger: 'blur' },
  176. ],
  177. depname: [
  178. { required: true, message: this.$t('请选择部门'), trigger: 'change' },
  179. ],
  180. tradefield: [
  181. { required: true, message: this.$t('请选择报备领域'), trigger: 'blur,change' },
  182. ],
  183. phonenumber: [
  184. { required: true, message: this.$t('请输入员工电话'), trigger: 'blur' },
  185. { pattern:/^1[3-9]\d{9}$/, message: this.$t('请输入正确手机号码'),trigger: 'blur' }
  186. ],
  187. email:[
  188. { pattern:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, message: this.$t('请输入正确邮箱'),trigger: 'blur' }
  189. ],
  190. discountrate: [
  191. { required: true, message: this.$t('请输入最低授权折扣'), trigger: 'blur' },
  192. { pattern:/^[0-9]+\.{0,1}[0-9]{0,2}$/,message: this.$t('只能输入数值'),trigger: 'blur'},
  193. ],
  194. },
  195. form:{
  196. "hrid":0,
  197. "hrcode":"",
  198. "name":"",
  199. "sex":0,
  200. "phonenumber":"",
  201. "officetelephone":"",
  202. "idcard":"",
  203. "email":"",
  204. "birthday":"",
  205. "remarks":"",
  206. "departmentid":"",
  207. "isleader":"",
  208. "position":"",
  209. "reporthrid":"",
  210. "userid":"0",
  211. "statue":0,
  212. 'isuppictured':'0',
  213. 'reporthrname':'',
  214. 'issalehr':'0',
  215. "salearea": []
  216. },
  217. value:[],
  218. deplist:[],
  219. pointValue:'',
  220. issalehr:'',
  221. tradefields:[],
  222. tablecols:[],
  223. list:[],
  224. salerList:[]
  225. }
  226. },
  227. methods:{
  228. async query_hrMain () {
  229. const res = await this.$api.requested({
  230. "classname": "webmanage.hr.hr",
  231. "method": "query_hrMain",
  232. "content": {
  233. "hrid":this.$route.query.id
  234. }
  235. })
  236. this.form = Object.assign({},this.form, res.data)
  237. /*this.form.discountrate = Math.round((this.form.discountrate*100)*100)/100*/
  238. this.issalehr = this.form.issalehr
  239. this.salerList = res.data.salearea.map(item=>{
  240. return {
  241. "name":this.form.name,
  242. "areaname":item.areaname,
  243. "discountrate":Math.round((item.discountrate * 100)*100)/100,
  244. "iseditprice":item.iseditprice,
  245. "sa_saleareaid":item.sa_saleareaid
  246. }
  247. })
  248. },
  249. areaLists(val){
  250. if (this.form.areaname == ''){
  251. this.form.areaname = val[0].areaname
  252. this.form.sa_saleareaid = val[0].sa_saleareaid
  253. this.form.discountrate = ''
  254. }
  255. },
  256. async department () {
  257. const res = await this.$api.requested({
  258. "classname": "webmanage.department.department",
  259. "method": "querydepartment",
  260. "content": {
  261. }
  262. })
  263. // 数据格式转换成elementui-tree所需的格式
  264. this.deplist = this.createMenu(res.data)
  265. },
  266. createMenu (array) {
  267. var that = this
  268. let arr = []
  269. function convertToElementTree(node) {
  270. // 新节点
  271. var elNode = {
  272. label: node["depname"],
  273. parentid:node['parentid'],
  274. departmentid:node["departmentid"],
  275. value:node["departmentid"],
  276. remarks:node["remarks"],
  277. isused:node["isused"],
  278. changedate:node['changedate'],
  279. changeby:node['changeby'],
  280. createdate:node['createdate'],
  281. createby:node['createby'],
  282. depno:node['depno'],
  283. children: []
  284. }
  285. if (node.subdep && node.subdep.length > 0) {
  286. // 如果存在子节点
  287. for (var index = 0; index < node.subdep.length; index++) {
  288. // 遍历子节点, 把每个子节点看做一颗独立的树, 传入递归构造子树, 并把结果放回到新node的children中
  289. elNode.children.push(convertToElementTree(node.subdep[index]));
  290. }
  291. }
  292. return elNode;
  293. }
  294. array.forEach((element) => {
  295. arr.push(convertToElementTree(element))
  296. });
  297. return arr
  298. },
  299. onShow () {
  300. this.list = []
  301. this.salerList = []
  302. this.query_hrMain()
  303. this.department()
  304. this.$store.dispatch('optiontypeselect','tradefield').then(res=>{
  305. this.tradefields = res.data
  306. })
  307. this.$store.dispatch('optiontypeselect','sex')
  308. this.dialogFormVisible = true
  309. },
  310. selectDep (data) {
  311. let obj = {
  312. depname:data.label,
  313. departmentid:data.departmentid
  314. }
  315. this.form = Object.assign({},this.form,obj)
  316. this.showTree = !this.showTree
  317. this.issalehr = this.form.issalehr
  318. },
  319. onSubmit () {
  320. this.$refs['form'].validate(async (valid) => {
  321. if (!valid) return false;
  322. /*this.form.discountrate = (this.form.discountrate /100).toFixed(4)*/
  323. this.form.salearea = this.salerList.map(item=>{
  324. return {
  325. "sa_saleareaid": item.sa_saleareaid,
  326. "discountrate": (item.discountrate/100).toFixed(4),
  327. "iseditprice": item.iseditprice
  328. }
  329. })
  330. const res = await this.$api.requested({
  331. "classname": "webmanage.hr.hr",
  332. "method": "insertormodify_hr",
  333. "content": this.form
  334. })
  335. if (res.code === 0) return this.$notify({
  336. title: this.$t('失败'),
  337. message: res.msg,
  338. type: 'error'
  339. });
  340. this.$notify({
  341. title: this.$t('成功'),
  342. message: this.$t('编辑成功'),
  343. type: 'success'
  344. });
  345. this.dialogFormVisible = false
  346. this.$emit('onSuccess')
  347. });
  348. },
  349. // 监听汇报对象选择
  350. selectMenber (data) {
  351. this.form.reporthrid = data.hrid
  352. },
  353. nodeClick(val){
  354. this.pointValue = val.departmentid
  355. this.visible = false
  356. this.selectDep(val)
  357. },
  358. selectArea(val){
  359. this.form.areaname = val.label
  360. this.form.sa_saleareaid = val.sa_saleareaid
  361. },
  362. discountrateChange(val){
  363. if (val < 0){
  364. this.form.discountrate = 1
  365. }else if(val > 100){
  366. this.form.discountrate = 100
  367. }else {
  368. this.form.discountrate = Math.round(val * 100)/100
  369. }
  370. },
  371. salerInfo(val){
  372. console.log(val,'创建的任务')
  373. /* this.list.push(newList)*/
  374. this.list = this.salerList
  375. /*this.list.splice(-1,0,val)*/
  376. this.list.push(val)
  377. console.log(this.list,'list表格数据')
  378. this.salerList = []
  379. this.salerList = this.list.map(item=>{
  380. console.log(item.iseditprice)
  381. return {
  382. "name":this.form.name,
  383. "areaname":item.areaname,
  384. "discountrate":item.discountrate,
  385. "iseditprice":item.iseditprice,
  386. "sa_saleareaid":item.sa_saleareaid
  387. }
  388. })
  389. console.log(this.salerList,'salerList')
  390. }
  391. },
  392. created() {
  393. this.tablecols = this.tool.tabelCol(this.$route.name).salerTable.tablecols
  394. }
  395. }
  396. </script>
  397. <style>
  398. .custom-tree-node {
  399. flex: 1;
  400. display: flex;
  401. align-items: center;
  402. justify-content: space-between;
  403. font-size: 14px;
  404. padding-right: 8px;
  405. background: none;
  406. }
  407. </style>
  408. <style scoped>
  409. .mb-30{
  410. margin-bottom:12px
  411. }
  412. </style>