addIndexSet.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. <template>
  2. <div class="box boxMinHeight">
  3. <PageHeadTwo :title="title"></PageHeadTwo>
  4. <div class="main">
  5. <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px" class="demo-ruleForm">
  6. <el-form-item label="指标类型" prop="type">
  7. <el-radio-group v-model="ruleForm.type">
  8. <el-radio :label="1">量化指标</el-radio>
  9. <el-radio :label="2">非量化指标</el-radio>
  10. <el-radio :label="3">额外加分项</el-radio>
  11. <el-radio :label="4">额外扣分项</el-radio>
  12. </el-radio-group>
  13. </el-form-item>
  14. <el-form-item label="指标分类" prop="cate_id">
  15. <el-select filterable v-model="ruleForm.cate_id" clearable style="width: 100%;">
  16. <el-option v-for="item in indexTypeList" :key="item.id" :label="item.name" :value="item.id"></el-option>
  17. </el-select>
  18. </el-form-item>
  19. <el-form-item label="指标名称" prop="name">
  20. <el-input placeholder="请输入指标名称" v-model="ruleForm.name" clearable show-word-limit maxlength="30"></el-input>
  21. </el-form-item>
  22. <el-form-item :label="fromName" prop="per_remark">
  23. <el-input placeholder="请输入" type="textarea" :rows="4" v-model="ruleForm.per_remark" clearable show-word-limit maxlength="500"></el-input>
  24. </el-form-item>
  25. <el-form-item label="加分上限" prop="point_limit" v-if="ruleForm.type == 3">
  26. <el-input placeholder="请输入加分上限" id="input2" v-model="ruleForm.point_limit" clearable @input="resetInput('input2')"></el-input>
  27. </el-form-item>
  28. <el-form-item label="扣分上限" prop="point_limit" v-if="ruleForm.type == 4">
  29. <el-input placeholder="请输入扣分上限" id="input3" v-model="ruleForm.point_limit" clearable @input="resetInput('input3')"></el-input>
  30. </el-form-item>
  31. <el-form-item label="备注" prop="remark">
  32. <el-input placeholder="请输入" type="textarea" v-model="ruleForm.remark" clearable :rows="4" show-word-limit maxlength="500"></el-input>
  33. </el-form-item>
  34. <el-form-item label="目标值" prop="target" v-if="ruleForm.type == 1"><el-input placeholder="请输入目标值" v-model="ruleForm.target" clearable></el-input></el-form-item>
  35. <el-form-item label="量化指标单位" prop="unit" v-if="ruleForm.type == 1">
  36. <el-input placeholder="请输入单位,比如%,元,万元" v-model="ruleForm.unit" clearable></el-input>
  37. </el-form-item>
  38. <el-form-item label="权重" prop="weight" v-if="ruleForm.type == 2 || ruleForm.type == 1">
  39. <el-input @input="resetInput('input')" id="input" placeholder="请输入权重(1~100)" v-model="ruleForm.weight"><span slot="append">%</span></el-input>
  40. </el-form-item>
  41. <el-form-item label="评分方式"><el-input placeholder="直接输入分数" disabled></el-input></el-form-item>
  42. <el-form-item label="结果值录入" prop="result_type" v-if="ruleForm.type == 1">
  43. <template slot="label">
  44. <span>结果值录入:</span>
  45. <el-tooltip effect="dark" placement="top">
  46. <template slot="content">
  47. 开启后,当前指标评分前需要先录入结果值。结果值用来记录考核周期内指标的实际完成情况。
  48. </template>
  49. <i class="el-icon-warning"></i>
  50. </el-tooltip>
  51. </template>
  52. <el-select v-model="ruleForm.result_type" class="width-250">
  53. <el-option label="不开启" value="none"></el-option>
  54. <el-option label="被考核人" value="self"></el-option>
  55. <el-option label="指定员工" value="special"></el-option>
  56. <el-option label="直属部门主管" value="supervisor"></el-option>
  57. </el-select>
  58. <div style="position: relative;margin-top: 10px;" v-if="ruleForm.result_type == 'special'" class="width-250">
  59. <el-input v-model="assignUser.name" placeholder="请选择指定员工"></el-input>
  60. <div @click="addUser(1)" class="inputDc"></div>
  61. </div>
  62. </el-form-item>
  63. <el-form-item label="管理记录人" prop="employee_ids">
  64. <div class="border flex-box-ce">
  65. <div class="flex-1" v-if="record_ids.length == 0">请选择记录人</div>
  66. <div v-else style="width: 510px;" class="font-flex-word">
  67. <span v-for="(item, index) in record_ids" :key="index">
  68. <i v-if="index != 0">,</i>
  69. {{ item.name }}
  70. </span>
  71. </div>
  72. <span v-if="record_ids.length > 0" class="blue">{{ record_ids.length }}人</span>
  73. <i class="el-icon-arrow-down icon-right" v-else></i>
  74. <div @click="isShowRecordFun()" class="inputDc"></div>
  75. </div>
  76. </el-form-item>
  77. <el-form-item label="指定评分人" prop="isReviewer">
  78. <el-switch v-model="ruleForm.isReviewer"></el-switch>
  79. <div>
  80. <div style="position: relative;" v-if="ruleForm.isReviewer">
  81. <el-input v-model="assignScoreUser.name" placeholder="请选择指定员工"></el-input>
  82. <div @click="addUser(2)" class="inputDc"></div>
  83. </div>
  84. <div class="fontColorF">开启后,该指标如被制定目标引用,该指标将由指定的人进行评分</div>
  85. </div>
  86. </el-form-item>
  87. <el-form-item label="加入统计项" prop="enable_ds" v-if="ruleForm.type == 1">
  88. <el-switch v-model="ruleForm.enable_ds"></el-switch>
  89. <div>
  90. <div class="fontColorF">开启后,该指标可以加入数据中台做汇总统计并分析</div>
  91. </div>
  92. </el-form-item>
  93. <el-form-item label="标签" prop="tag_ids">
  94. <el-select v-model="ruleForm.tag_ids" multiple placeholder="请选择标签" style="width:100%;">
  95. <el-option v-for="item in tabs" :key="item.id" :label="item.name" :value="item.id"></el-option>
  96. </el-select>
  97. </el-form-item>
  98. </el-form>
  99. <div style="text-align: right;position: sticky;bottom: 0px;z-index: 999;width: 700px;margin: 0 auto;padding: 10px 0;background-color: #fff;">
  100. <el-button @click="$router.go(-1)">取消</el-button>
  101. <el-button type="primary" @click="submitForm('ruleForm')">保存设置</el-button>
  102. </div>
  103. </div>
  104. <!-- 选择子管理员 -->
  105. <EmployeeSelector :multi="false" :is_filtration_creator="false" :selected="selected" :isChecKedAll="false" :visible.sync="setAdministrator" @confirm="confirmAdministrator" />
  106. <EmployeeSelector :is_filtration_creator="false" :selected="selected2" :visible.sync="isShowRecord" @confirm="confirmAdministrator2" />
  107. </div>
  108. </template>
  109. <script>
  110. import EmployeeSelector from '@/components/public/EmployeeSelector';
  111. import PageHeadTwo from '@/components/public/PageHeadTwo';
  112. export default {
  113. name: 'addIndexSet',
  114. components: { EmployeeSelector, PageHeadTwo },
  115. data() {
  116. return {
  117. title: '新增指标',
  118. tabs: [],
  119. AdministratorName: '',
  120. setAdministrator: false,
  121. fromName: '考核标准',
  122. selected: { employee: [], dept: [] }, //已经选择人员
  123. selected2: { employee: [], dept: [] }, //已经选择人员
  124. assignUser: {},
  125. assignScoreUser: {},
  126. record_ids: [],
  127. isShowRecord: false,
  128. ruleForm: {
  129. cate_id: '', //指标分类id
  130. name: '', //指标名称
  131. per_remark: '', //考核标准
  132. remark: '', //备注
  133. type: 1, //默认1 指标种类 1-量化指标 2-行为价值观指标 3-额外加分项 4-额外扣分项
  134. unit: '', //量化指标单位
  135. target: '', //目标值
  136. result_type: 'none', //(结果值录入者设置,none-不开启 self-被考核人 special-指定员工 supervisor-指定主管’
  137. result_employee_id: '', //结果值录入者id, 只有result_type为special时才需要指定
  138. weight: null, //权重 0-100之间
  139. reviewer_id: '', //指定审批人(评分人)id
  140. point_limit: '', //分数上限,只对额外加分项以及额外扣分项有用
  141. tag_ids: [], //指标id 数组或逗号分割
  142. enable_ds: false, //是否加入统计项
  143. isReviewer: false, //指定评分人
  144. record_ids: [] //管理记录人
  145. },
  146. rules: {
  147. name: [{ required: true, message: '请输入指标名称', trigger: 'blur' }, { min: 2, message: '最少2个字符', trigger: 'blur' }],
  148. cate_id: [{ required: true, message: '请选择指标分类', trigger: 'change' }],
  149. per_remark: [{ required: true, message: '请输入标准', trigger: 'blur' }],
  150. weight: [{ required: true, message: '请输入权重', trigger: 'blur' }]
  151. },
  152. indexTypeList: [],
  153. isUserIndex: 1,
  154. id: '' //编辑时用
  155. };
  156. },
  157. watch: {
  158. id(val) {
  159. if (val) {
  160. this.title = '指标详情';
  161. } else {
  162. this.title = '新增指标';
  163. }
  164. },
  165. assignUser(val) {
  166. if (val) {
  167. this.ruleForm.result_employee_id = val.id;
  168. }
  169. },
  170. assignScoreUser(val) {
  171. if (val) {
  172. this.ruleForm.reviewer_id = val.id;
  173. }
  174. },
  175. 'ruleForm.type'(val) {
  176. this.ruleForm.enable_ds = false
  177. if (val == 3) {
  178. this.fromName = '加分标准';
  179. } else if (val == 4) {
  180. this.fromName = '扣分标准';
  181. } else {
  182. this.fromName = '考核标准';
  183. }
  184. },
  185. record_ids(val) {
  186. let ids = val.map(item => {
  187. return item.id;
  188. });
  189. this.ruleForm.record_ids = ids || '';
  190. }
  191. },
  192. mounted() {
  193. this.$nextTick(() => {
  194. this.getIndexType();
  195. this.getTagList();
  196. });
  197. if (this.$route.query.item) {
  198. this.recoverData();
  199. }
  200. if (this.$route.query.cate_id) {
  201. this.ruleForm.cate_id =parseInt(this.$route.query.cate_id);
  202. }
  203. },
  204. methods: {
  205. isShowRecordFun() {
  206. this.selected2.employee = this.record_ids;
  207. this.isShowRecord = true;
  208. },
  209. confirmAdministrator2(e) {
  210. this.record_ids = e.employee.length > 0 ? e.employee : [];
  211. },
  212. // 最大值不能大于100
  213. resetInput(str) {
  214. //解决v-model与oninput同时使用失效问题
  215. var dom = document.getElementById(str);
  216. var value = dom.value;
  217. //写你自己的输入规则
  218. value = value.replace(/[^\d]/g, '');
  219. if (value > 100 && str == 'input') {
  220. this.ruleForm.weight = '';
  221. this.$message.error('不能大于100');
  222. return false;
  223. }
  224. dom.value = value; //输入框赋值
  225. str == 'input' ? (this.ruleForm.weight = dom.value) : (this.ruleForm.point_limit = dom.value);
  226. },
  227. recoverData() {
  228. let item = JSON.parse(this.$route.query.item);
  229. item.isReviewer = item.reviewer_id ? true : false;
  230. item.enable_ds = item.enable_ds == 1 ? true : false;
  231. this.id = item.id;
  232. this.ruleForm = item;
  233. item.point_limit = item.point_limit == 0 ? '' : item.point_limit;
  234. let record_ids = item.record_ids;
  235. this.record_ids = record_ids.map(e => {
  236. let user = this.$getEmployeeList()[e];
  237. return user;
  238. });
  239. this.assignUser = this.$getEmployeeList()[item.result_employee_id] ? this.$getEmployeeList()[item.result_employee_id] : {};
  240. this.assignScoreUser = this.$getEmployeeList()[item.reviewer_id] ? this.$getEmployeeList()[item.reviewer_id] : {};
  241. },
  242. //选择人员
  243. addUser(index) {
  244. if (index == 1) {
  245. this.selected.employee = this.assignUser.name ? [this.assignUser] : [];
  246. } else {
  247. this.selected.employee = this.assignScoreUser.name ? [this.assignScoreUser] : [];
  248. }
  249. this.isUserIndex = index;
  250. this.setAdministrator = true;
  251. },
  252. //获取指标分类
  253. getIndexType() {
  254. this.$axios('get', 'api/per/index/cate/list').then(res => {
  255. this.indexTypeList = res.data.data.list || [];
  256. });
  257. },
  258. //获取标签列表
  259. getTagList() {
  260. this.$axios('get', 'api/per/index/tag').then(res => {
  261. this.tabs = res.data.data.list || [];
  262. });
  263. },
  264. submitForm(formName) {
  265. this.$refs[formName].validate(valid => {
  266. if (valid) {
  267. if (this.ruleForm.result_type == 'special') {
  268. if (!this.ruleForm.result_employee_id) {
  269. this.$message.error('请选择指定人员');
  270. return;
  271. }
  272. }
  273. if (this.ruleForm.type == 1 || this.ruleForm.type == 2) {
  274. if (this.ruleForm.weight == '0') {
  275. this.$message.error('权重不能为0');
  276. return false;
  277. }
  278. }
  279. if (this.ruleForm.type == 3 || this.ruleForm.type == 4) {
  280. if (this.ruleForm.point_limit == '0') {
  281. this.$message.error('分数上限不能为0');
  282. return false;
  283. }
  284. }
  285. if (this.ruleForm.isReviewer) {
  286. if (!this.ruleForm.reviewer_id) {
  287. this.$message.error('请选择指定评分人');
  288. return;
  289. }
  290. }
  291. let ruleForm = this.ruleForm;
  292. let data = {
  293. cate_id: ruleForm.cate_id, //指标分类id
  294. name: ruleForm.name, //指标名称
  295. per_remark: ruleForm.per_remark, //考核标准
  296. remark: ruleForm.remark, //备注
  297. type: ruleForm.type, //默认1 指标种类 1-量化指标 2-行为价值观指标 3-额外加分项 4-额外扣分项
  298. unit: ruleForm.unit, //量化指标单位
  299. target: ruleForm.target, //目标值
  300. result_type: ruleForm.result_type, //(结果值录入者设置,none-不开启 self-被考核人 special-指定员工 supervisor-指定主管’
  301. result_employee_id: ruleForm.result_employee_id, //结果值录入者id, 只有result_type为special时才需要指定
  302. weight: ruleForm.weight, //权重 0-100之间
  303. reviewer_id: ruleForm.isReviewer ? ruleForm.reviewer_id : '', //指定审批人(评分人)id
  304. point_limit: ruleForm.point_limit, //分数上限,只对额外加分项以及额外扣分项有用
  305. tag_ids: ruleForm.tag_ids.length > 0 ? ruleForm.tag_ids : '', //指标id 数组或逗号分割
  306. record_ids: ruleForm.record_ids.length > 0 ? ruleForm.record_ids : '', //指定跟踪管理记录人 数组
  307. enable_ds: ruleForm.enable_ds ? 1 : 0
  308. };
  309. if (this.id) {
  310. data.index_id = this.id;
  311. }
  312. let url = this.id ? 'api/per/index/update' : 'api/per/index/add';
  313. this.$axios('post', url, data).then(res => {
  314. this.$message.success(this.id ? '编辑成功' : '添加成功');
  315. this.$router.go(-1);
  316. });
  317. } else {
  318. console.log('error submit!!');
  319. return false;
  320. }
  321. });
  322. },
  323. // 保存人员
  324. confirmAdministrator(e) {
  325. if (this.isUserIndex == 1) {
  326. this.assignUser = e.employee.length > 0 ? e.employee[0] : {};
  327. } else {
  328. this.assignScoreUser = e.employee.length > 0 ? e.employee[0] : {};
  329. }
  330. this.setAdministrator = false;
  331. }
  332. }
  333. };
  334. </script>
  335. <style scoped="scoped">
  336. .border {
  337. -webkit-appearance: none;
  338. background-color: #fff;
  339. background-image: none;
  340. border-radius: 4px;
  341. border: 1px solid #dcdfe6;
  342. -webkit-box-sizing: border-box;
  343. box-sizing: border-box;
  344. color: #c0c4cf;
  345. font-size: inherit;
  346. height: auto;
  347. outline: 0;
  348. padding: 0 15px;
  349. /* width: 400px; */
  350. position: relative;
  351. cursor: pointer;
  352. }
  353. .border .font-flex-word {
  354. color: #606266;
  355. }
  356. .box {
  357. padding: 20px;
  358. font-size: 14px;
  359. background-color: #fff;
  360. }
  361. .main {
  362. margin-top: 40px;
  363. }
  364. .inputDc {
  365. position: absolute;
  366. top: 0;
  367. right: 0;
  368. left: 0;
  369. bottom: 0;
  370. z-index: 9;
  371. cursor: pointer;
  372. }
  373. .demo-ruleForm {
  374. width: 700px;
  375. margin: 0 auto;
  376. }
  377. ::v-deep .el-textarea__inner::-webkit-scrollbar {
  378. width: 6px;
  379. height: 4px;
  380. }
  381. /*外层轨道。可以用display:none让其不显示,也可以添加背景图片,颜色改变显示效果*/
  382. ::v-deep .el-textarea__inner::-webkit-scrollbar-track {
  383. width: 6px;
  384. background-color: #fff0;
  385. -webkit-border-radius: 2em;
  386. -moz-border-radius: 2em;
  387. border-radius: 2em;
  388. }
  389. /*滚动条的设置*/
  390. ::v-deep .el-textarea__inner::-webkit-scrollbar-thumb {
  391. background-color: #fff0;
  392. background-clip: padding-box;
  393. -webkit-border-radius: 2em;
  394. -moz-border-radius: 2em;
  395. border-radius: 2em;
  396. }
  397. /*滚动条移上去的背景*/
  398. ::v-deep .el-textarea__inner:hover::-webkit-scrollbar-thumb {
  399. background-color: rgba(144, 147, 153, 0.3);
  400. height: 20px;
  401. }
  402. </style>