user-skill.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <template>
  2. <div class="mainContentBox">
  3. <avue-form
  4. ref="formRef"
  5. v-model:search="search"
  6. v-model="form"
  7. :data="data"
  8. :option="option2"
  9. v-model:page="page"
  10. @row-save="createRow"
  11. @row-update="updateRow"
  12. @row-del="deleteRow"
  13. @search-change="searchChange"
  14. @size-change="dataList"
  15. @current-change="dataList"
  16. @selection-change="selectionChange"
  17. >
  18. </avue-form>
  19. <avue-crud
  20. ref="crudRef"
  21. v-model="form"
  22. :data="data"
  23. :option="option"
  24. v-model:page="page"
  25. @row-save="createRow"
  26. @row-update="updateRow"
  27. @row-del="deleteRow"
  28. >
  29. <template #skillDictValue="{row,index,type}">
  30. <el-select v-model="skillValue" placeholder="请选择技能" @click="getPostSkills()" @change="skillChange(row)">
  31. <el-option
  32. v-for="item in optionSkill"
  33. :key="item.value"
  34. :label="item.skillDictLabel"
  35. :value="item.skillDictValue"
  36. >
  37. </el-option>
  38. </el-select>
  39. </template>
  40. <template #menu-left="{ size }">
  41. <el-button
  42. type="primary"
  43. icon="el-icon-plus"
  44. circle
  45. @click="addSkill"
  46. ></el-button
  47. ></template>
  48. </avue-crud>
  49. <CommonTable
  50. ref="ctableRef"
  51. tableTitle="员工选择"
  52. tableType="USERS"
  53. @selected-sure="onSelectedFinish"
  54. />
  55. <div class="detail-footer">
  56. <el-button type="primary" @click="onHandle"> 确定 </el-button>
  57. <el-button @click="cancelWindow">取消</el-button>
  58. </div>
  59. </div>
  60. </template>
  61. <script setup>
  62. import { ref, getCurrentInstance } from "vue";
  63. import { useCrud } from "@/hooks/userCrud";
  64. import ButtonPermKeys from "@/common/configs/buttonPermission";
  65. import { useCommonStoreHook, useDictionaryStore } from "@/store";
  66. import dictDataUtil from "@/common/configs/dictDataUtil";
  67. import SingleUpload from "@/components/Upload/SingleUpload.vue";
  68. const { isShowTable, tableType } = toRefs(useCommonStoreHook());
  69. import {getPostSkill,addEmployeeSkill} from "@/api/system/skill";
  70. // 数据字典相关
  71. const { dicts } = useDictionaryStore();
  72. const test = () => {
  73. isShowTable.value = true;
  74. tableType.value = tableType.value == 1 ? 2 : 1;
  75. };
  76. const data2=ref(null);
  77. // 传入一个url,后面不带/
  78. const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
  79. useCrud({
  80. src: "/api/v1/sys/skillScore",
  81. });
  82. const { dataList, createRow, updateRow, deleteRow, searchChange, dataNoPageList } =
  83. Methords; //增删改查
  84. const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
  85. const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
  86. // checkBtnPerm(ButtonPermKeys.PLAN.BTNS.order_add) :permission="permission"
  87. // const permission = reactive({
  88. // delBtn: checkPerm(buttonPermission.PLAN.BTNS.order_del),
  89. // addBtn: checkPerm(buttonPermission.PLAN.BTNS.order_add),
  90. // editBtn: checkPerm(buttonPermission.PLAN.BTNS.order_edit),
  91. // menu: true,
  92. // });
  93. const option2=ref(null);
  94. const ctableRef = ref(null); //crudRef.value 获取avue-crud对象
  95. const router = useRouter();
  96. onMounted(() => {
  97. // console.log("crudRef", crudRef)
  98. //dataNoPageList();
  99. });
  100. const skillChange=(row)=>{
  101. if(skillValue.value!==undefined&&skillValue.value!==null&&skillValue.value!==""){
  102. data.value[row.$index].skillDictValue=skillValue.value;
  103. }
  104. }
  105. const cancelWindow=()=>{
  106. props.dialog.visible=false;
  107. }
  108. const addSkill = () => {
  109. const bom=ref({
  110. $cellEdit:true,
  111. });
  112. data.value.push(bom.value);
  113. };
  114. const employeeSkill=ref({});
  115. const onHandle=()=>{
  116. console.info(form.value);
  117. if(form.value.userId===null||form.value.userId===undefined||form.value.userId===""){
  118. ElMessage({
  119. message: "未选择打分用户",
  120. type: "error",
  121. });
  122. return false;
  123. }
  124. if(form.value.postId===null||form.value.postId===undefined||form.value.postId===""){
  125. ElMessage({
  126. message: "未选择岗位",
  127. type: "error",
  128. });
  129. return false;
  130. }
  131. console.info("data",data.value);
  132. if(data.value.length===0){
  133. ElMessage({
  134. message: "没有要保存的打分项",
  135. type: "error",
  136. });
  137. return false;
  138. }
  139. if(data.value.length>0){
  140. for(let i=0;i<data.value.length;i++){
  141. if(data.value[i].skillDictValue===undefined||data.value[i].skillDictValue===null||data.value[i].skillDictValue===""){
  142. ElMessage({
  143. message: "第"+(i+1)+"项没有选择技能",
  144. type: "error",
  145. });
  146. return false;
  147. }
  148. if(data.value[i].score===undefined||data.value[i].score===null||data.value[i].score===""){
  149. ElMessage({
  150. message: "第"+(i+1)+"项没有打分",
  151. type: "error",
  152. });
  153. return false;
  154. }
  155. }
  156. }
  157. employeeSkill.value.userId=form.value.userId;
  158. employeeSkill.value.postId=form.value.postId;
  159. employeeSkill.value.skillList=Array.from(data.value);
  160. console.info("11",employeeSkill.value)
  161. addEmployeeSkill(employeeSkill.value).then(
  162. (data)=>{
  163. if(data.code==="200") {
  164. ElMessage({
  165. message: data.msg,
  166. type: "success",
  167. });
  168. props.dialog.visible=false;
  169. }
  170. else {
  171. ElMessage({
  172. message: data.msg,
  173. type: "error",
  174. });
  175. }
  176. }
  177. )
  178. }
  179. const postIdValue=ref(null);
  180. // 设置表格列或者其他自定义的option
  181. option2.value = {
  182. selection: true,
  183. submitBtn:false,
  184. clearAbleBtn:false,
  185. emptyBtn:false,
  186. column: [
  187. { label: "用户id", prop: "userId", width: 130,overHidden: true,search: true ,
  188. filterable: true,
  189. width: 100,overHidden: true,
  190. disabled:true,
  191. display:false,
  192. },
  193. { label: "用户名", prop: "userName", width: 140,overHidden: true,search: true ,rules: [{
  194. required: true,
  195. search: true,
  196. message: "请选择员工姓名",
  197. trigger: "blur"
  198. }],
  199. click: ({ value, column }) => {
  200. ctableRef.value.startSelect();
  201. },},
  202. { label: "所属机构", prop: "institution", width: 130,overHidden: true,search: true ,
  203. filterable: true,
  204. width: 100,overHidden: true,
  205. disabled:true,
  206. },
  207. {
  208. label: "员工编号",
  209. prop: "employeeCode",
  210. search: true,
  211. disabled:true,
  212. },
  213. { label: "岗位", prop: "postId",
  214. search: true,
  215. filterable: true,
  216. type: "select",
  217. overHidden: true,
  218. dicUrl:dictDataUtil.post_list_url,
  219. dicMethod:"post",
  220. change:({ value, column })=>{
  221. if(value!==undefined) {
  222. postIdValue.value = value;
  223. skillValue.value=null;
  224. optionSkill.value=null;
  225. }
  226. },
  227. props: { label: "postName", value: "id" },
  228. },
  229. { label: "部门", prop: "deptName", overHidden: true,
  230. disabled:true, },
  231. ],
  232. };
  233. const props = defineProps({
  234. dialog:{
  235. type:Object,
  236. default:()=>{
  237. return {};
  238. }
  239. }
  240. })
  241. // 设置表格列或者其他自定义的option
  242. option.value = Object.assign(option.value,{
  243. selection: false,
  244. addBtn: false,
  245. viewBtn: false,
  246. editBtn:false,
  247. saveBtn:false,
  248. cellBtn: true,
  249. column: [{
  250. label: "技能",
  251. prop: "skillDictValue",
  252. align: 'center',
  253. headerAlign: 'center',
  254. span:24,
  255. type: 'select',
  256. dicData:dicts.skill_type,
  257. props: { label: "dictLabel", value: "dictValue" },
  258. },
  259. {
  260. label: "分数",
  261. prop: "score",
  262. align: 'center',
  263. headerAlign: 'center',
  264. cell: true,
  265. type:"number",
  266. precision: 2,
  267. max:100,
  268. min:0,
  269. span:24,
  270. },],
  271. });
  272. const onSelectedFinish=(selectedValue)=>{
  273. form.value.userId=selectedValue.id;
  274. form.value.userName=selectedValue.userName;
  275. form.value.deptName=selectedValue.deptName;
  276. form.value.employeeCode=selectedValue.employeeCode;
  277. form.value.institution=selectedValue.institution;
  278. }
  279. const skillValue=ref(null);
  280. const optionSkill=ref([]);
  281. const getPostSkills=()=>{
  282. if(postIdValue.value===undefined||postIdValue.value===null||postIdValue.value===""){
  283. ElMessage({
  284. message: "未选择岗位",
  285. type: "error",
  286. });
  287. return false;
  288. }
  289. getPostSkill(postIdValue.value).then(
  290. (data)=>{
  291. optionSkill.value=Array.from(data.data);
  292. }
  293. )
  294. }
  295. </script>
  296. <style type="text/css">
  297. .title-detail{
  298. width: 30%;
  299. height: 50px;
  300. line-height: 50px;
  301. margin: 25px 20px 25px 0;
  302. float: left;
  303. }
  304. .detail{
  305. margin: 0 auto;
  306. width: 100%;
  307. }
  308. .avue-crud{
  309. float: left;
  310. }
  311. .detail-footer{
  312. float: right;
  313. margin-top:15px;
  314. }
  315. .el-select__selection{
  316. width: 150px;
  317. }
  318. </style>