attendance_groupnew.vue 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273
  1. <template>
  2. <div style="background-color: #fff; padding:20px;" class="boxMinHeight">
  3. <div style="margin-top:2px; margin-bottom:15px;" class="inline-block-btn-list flex-box-ce">
  4. <el-button
  5. class="first-element-btn"
  6. v-if="profile.employee_detail.role_list.findIndex(item => item.name == 'admin' || 'point_manager' || 'creator') >= 0"
  7. :disabled="multipleSelection.length < 1"
  8. @click="confirmMultipleDelete"
  9. type="primary"
  10. plain
  11. >
  12. 批量删除
  13. </el-button>
  14. <el-button @click="toDetailPage(0, $event)" type="primary" style="margin-right:10px;">创建考勤组</el-button>
  15. <el-select v-model="filter.employee_id" clearable filterable placeholder="请输入或选择人员" @change="employeSearch">
  16. <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
  17. </el-select>
  18. <div class="gap-right-8" style="display:inline-block; width:220px;margin-left: 10px;">
  19. <el-input placeholder="输入关键词查找" ref="search-bar" v-model="filter.keywords" class="input-with-select" @keyup.enter.native="onFilterChanged">
  20. <el-button slot="append" icon="el-icon-search" @click="onFilterChanged"></el-button>
  21. </el-input>
  22. </div>
  23. <div class="flex-1"></div>
  24. <span class="blue cursor" @click="$openUrl(13)"><i class="el-icon-question" style="padding-right: 5px;font-size: 14px;position: relative;top: 1px;"></i>考勤组如何设置</span>
  25. </div>
  26. <el-table @selection-change="handleSelectionChange" v-loading="loading" ref="multipleTable" :data="tableData" :border="false" tooltip-effect="dark" style="width: 100%">
  27. <el-table-column type="selection" width="50" v-if="profile.employee_detail.role_list.findIndex(item => item.name == 'admin' || 'point_manager' || 'creator') >= 0"></el-table-column>
  28. <el-table-column prop="name" label="名称" :filterMultiple="false"></el-table-column>
  29. <el-table-column prop="type" label="类型" width="150">
  30. <template slot-scope="scope">
  31. <span v-if="scope.row.type == 0">固定班制</span>
  32. <span v-if="scope.row.type == 1">排班制</span>
  33. <span v-if="scope.row.type == 2">自由上下班</span>
  34. </template>
  35. </el-table-column>
  36. <el-table-column label="班次" width="300" header-align="center" align="left">
  37. <template slot-scope="scope">
  38. <div v-for="(items, index) in scope.row.schedules" :key="index">
  39. <div v-for="(item, index) in items.config.split(',')" :key="index" style="margin:8px 0">
  40. <div style="vertical-align: top; display: table-cell;font-size:15px;font-weight:bold;">
  41. 打卡时段:
  42. <span style="color:#409EFF;font-weight:bold;">{{ item.split('-')[0] }}-{{ item.split('-')[3] }}</span>
  43. </div>
  44. <div>
  45. <span>{{ item.split('-')[0] }}</span>
  46. 最早打卡时间
  47. <span>{{ item.split('-')[3] }}</span>
  48. 最晚打卡时间
  49. </div>
  50. <div>
  51. <span>{{ item.split('-')[1] }}</span>
  52. 上班打卡时间
  53. <span>{{ item.split('-')[2] }}</span>
  54. 下班打卡时间
  55. </div>
  56. </div>
  57. </div>
  58. </template>
  59. </el-table-column>
  60. <el-table-column align="left" label="操作" width="200">
  61. <template slot-scope="scope">
  62. <div>
  63. <el-button type="text" style="color:#409EFF !important;" @click="toDetailPage(scope.row.id, $event)">修改</el-button>
  64. <el-button
  65. style="color:#f56c6c !important;"
  66. v-if="profile.employee_detail.role_list.findIndex(item => item.name == 'admin' || 'point_manager' || 'creator') >= 0"
  67. type="text"
  68. @click="confirmDelete(scope.row.id)"
  69. >
  70. 删除
  71. </el-button>
  72. </div>
  73. <el-button type="text" style="color:#606266 !important;" @click="attendance_duty_show(scope.row.id)" v-if="scope.row.type != 2">排班表</el-button>
  74. <el-button type="text" style="color:#606266 !important;" @click="corde(scope.row)">积分设置</el-button>
  75. </template>
  76. </el-table-column>
  77. </el-table>
  78. <center style="margin: 20px;">
  79. <el-pagination
  80. background
  81. layout="total,sizes, prev, pager, next"
  82. :page-sizes="[10, 20, 50, 100]"
  83. :page-size="pageLimit"
  84. :total="totalCount"
  85. @size-change="handleSizeChange"
  86. :current-page.sync="currentPage"
  87. @current-change="changePage"
  88. ></el-pagination>
  89. </center>
  90. <el-dialog class="attendance_group" :title="dialog_title" @close="formReset" :visible.sync="RuleDetailDialogVisible" width="800px" top="50px">
  91. <div style="padding:0 50px;" v-if="dialog_title != '创建考勤组'">
  92. <el-alert style="margin-bottom:30px;" title="修改设置会影响现有排班,请谨慎操作!" type="warning"></el-alert>
  93. </div>
  94. <div style="padding:0 50px;">
  95. <el-form ref="formdata" :model="formdata" label-width="100px" :rules="formrule">
  96. <el-form-item label="考勤组名称" prop="name"><el-input style="width:350px;" maxlength="30" v-model="formdata.name"></el-input></el-form-item>
  97. <el-form-item label="参与人员" prop="employee_ids">
  98. <el-card class="box-card" shadow="hover">
  99. <div class="tag-box-padding">
  100. <el-tag v-for="(tag, index) in formdata.employee" :key="index" type="success" @close="employee_delete(tag.id, index)" closable>{{ tag.name }}</el-tag>
  101. <el-button size="mini" @click="EmployeeSelector0_show">选择</el-button>
  102. </div>
  103. </el-card>
  104. </el-form-item>
  105. <el-form-item label="不参与人员" v-if="formdata.employee.length != 0">
  106. <el-card class="box-card" shadow="hover">
  107. <div class="tag-box-padding">
  108. <el-tag v-for="(tag, index) in formdata.un_employee" :key="index" @close="un_employee_delete(tag.id, index)" type="success" closable>{{ tag.name }}</el-tag>
  109. <el-button size="mini" @click="EmployeeSelector1_show">选择</el-button>
  110. </div>
  111. </el-card>
  112. </el-form-item>
  113. <el-form-item label="考勤类型">
  114. <el-radio-group v-model="formdata.type" :disabled="profile.manager_type < 2 || isChose">
  115. <el-radio :label="0">固定班制</el-radio>
  116. <el-radio :label="1">排班制</el-radio>
  117. <el-radio :label="2">自由上下班</el-radio>
  118. </el-radio-group>
  119. </el-form-item>
  120. <el-form-item label="班次">
  121. <el-tag @close="attendance_setting_delete(tag, index)" v-for="(tag, index) in formdata.attendance_setting_list" :key="index" type="success" closable>
  122. {{ tag.name }}
  123. </el-tag>
  124. <el-button size="mini" @click="class_selector_show">选择班次</el-button>
  125. </el-form-item>
  126. <div style="position: relative;top:-10px;left: 100px;font-size: 12px;" class="orange">如您操作删除了部分班次,请注意检查【排班表】并取消相关班次的排班</div>
  127. <el-form-item label="工作日" v-if="formdata.type == 2">
  128. <el-checkbox-group v-model="work_date_list">
  129. <el-checkbox v-for="(item, index) in formdata.work_date" :key="index" :label="index" name="work_date">{{ item.name }}</el-checkbox>
  130. </el-checkbox-group>
  131. </el-form-item>
  132. <el-form-item label="排班周期" v-if="formdata.type == 1">
  133. <el-select v-model="work_date_length" placeholder="2">
  134. <el-option label="2天" :value="2"></el-option>
  135. <el-option label="3天" :value="3"></el-option>
  136. <el-option label="4天" :value="4"></el-option>
  137. <el-option label="5天" :value="5"></el-option>
  138. <el-option label="6天" :value="6"></el-option>
  139. <el-option label="7天" :value="7"></el-option>
  140. <el-option label="8天" :value="8"></el-option>
  141. <el-option label="9天" :value="9"></el-option>
  142. <el-option label="10天" :value="10"></el-option>
  143. <el-option label="11天" :value="11"></el-option>
  144. <el-option label="12天" :value="12"></el-option>
  145. <el-option label="13天" :value="13"></el-option>
  146. <el-option label="14天" :value="14"></el-option>
  147. <el-option label="15天" :value="15"></el-option>
  148. <el-option label="16天" :value="16"></el-option>
  149. <el-option label="17天" :value="17"></el-option>
  150. <el-option label="18天" :value="18"></el-option>
  151. <el-option label="19天" :value="19"></el-option>
  152. <el-option label="20天" :value="20"></el-option>
  153. <el-option label="21天" :value="21"></el-option>
  154. <el-option label="22天" :value="22"></el-option>
  155. <el-option label="23天" :value="23"></el-option>
  156. <el-option label="24天" :value="24"></el-option>
  157. <el-option label="25天" :value="25"></el-option>
  158. <el-option label="26天" :value="26"></el-option>
  159. <el-option label="27天" :value="27"></el-option>
  160. <el-option label="28天" :value="28"></el-option>
  161. <el-option label="29天" :value="29"></el-option>
  162. <el-option label="30天" :value="30"></el-option>
  163. <el-option label="31天" :value="31"></el-option>
  164. </el-select>
  165. </el-form-item>
  166. <el-form-item v-if="formdata.type == 1">
  167. <el-table border :data="formdata.work_date" style="width: 350px;">
  168. <el-table-column width="80" prop="name" label="时间"></el-table-column>
  169. <el-table-column prop="setting_id" label="班次">
  170. <template slot-scope="scope">
  171. <el-select v-model="scope.row.setting_id" placeholder="请选择">
  172. <el-option v-for="item in formdata.attendance_setting_list" :key="item.value" :label="item.name" :value="item.value"></el-option>
  173. <el-option :key="0" label="休息(不上班)" :value="0"></el-option>
  174. </el-select>
  175. </template>
  176. </el-table-column>
  177. </el-table>
  178. </el-form-item>
  179. <el-form-item v-if="formdata.type == 0">
  180. <el-table border :data="formdata.work_date" style="width: 350px;">
  181. <el-table-column width="80" prop="name" label="时间"></el-table-column>
  182. <el-table-column prop="setting_id" label="班次">
  183. <template slot-scope="scope">
  184. <el-select v-model="scope.row.setting_id" placeholder="请选择">
  185. <el-option v-for="item in formdata.attendance_setting_list" :key="item.value" :label="item.name" :value="item.value"></el-option>
  186. <el-option :key="0" label="休息(不上班)" :value="0"></el-option>
  187. </el-select>
  188. </template>
  189. </el-table-column>
  190. </el-table>
  191. </el-form-item>
  192. <el-form-item label="必须打卡日期" v-if="formdata.type == 2">
  193. <el-card class="box-card" shadow="hover">
  194. <div class="tag-box-padding">
  195. <el-tag color="#fff" v-for="(tag, index) in formdata.date_must" :key="tag" type="success" @change="changeTag" @close="date_must_delete(tag, index)" closable>
  196. {{ tag }}
  197. </el-tag>
  198. <el-button @click="DateMustShow" size="mini">选择日期</el-button>
  199. </div>
  200. </el-card>
  201. </el-form-item>
  202. <el-form-item label="不用打卡日期" v-if="formdata.type == 2">
  203. <el-card class="box-card" shadow="hover">
  204. <div class="tag-box-padding">
  205. <el-tag v-for="(tag, index) in formdata.date_not" :key="tag" @close="date_not_delete(tag, index)" type="success" closable>{{ tag }}</el-tag>
  206. <el-button size="mini" @click="DateNotShow">选择日期</el-button>
  207. </div>
  208. </el-card>
  209. </el-form-item>
  210. <el-form-item label="打卡位置" class="is-required">
  211. <el-card class="box-card" shadow="hover">
  212. <el-button size="mini" @click="show_map_com">添加位置</el-button>
  213. <span style="color:#999; padding-left:1rem;">您可以添加多个位置并且设置有效打卡距离</span>
  214. <div v-for="(l, li) in formdata.location" @click.stop="openMap(l)" :key="li" role="alert" class="el-alert el-alert--success" style="margin-top: 15px;">
  215. <div class="el-alert__content">
  216. <div class="el-alert__title is-bold">{{l.name2}}</div>
  217. <div class="el-alert__description">{{ '有效打卡范围' + l.radius + '米' }}</div>
  218. <div class="el-alert__description">{{ l.name }}</div>
  219. <i class="el-alert__closebtn el-icon-close" @click.stop="location_del(li)"></i>
  220. </div>
  221. </div>
  222. </el-card>
  223. <el-checkbox v-model="is_out_attendance">允许外勤打卡(外勤打卡不加分)</el-checkbox>
  224. </el-form-item>
  225. <el-form-item label="加班规则" prop="overtime_rule">
  226. <el-select v-model="formdata.overtime_rule" placeholder="请选择">
  227. <el-option v-for="item in overtime_rule_list" :key="item.id" :label="item.name" :value="item.id"></el-option>
  228. </el-select>
  229. </el-form-item>
  230. </el-form>
  231. </div>
  232. <span slot="footer" class="dialog-footer">
  233. <el-button @click="RuleDetailDialogVisible = false">取 消</el-button>
  234. <el-button type="primary" @click="saveFormData" :loading="save_loading">保 存</el-button>
  235. </span>
  236. </el-dialog>
  237. <!-- 地图展示 -->
  238. <el-dialog :close-on-click-modal="false" class="setMapBaidu" title="添加打卡位置" :visible.sync="MapBoxDialogVisible" width="700px">
  239. <div v-loading="bdMap_loading">
  240. <el-input prefix-icon="el-icon-search" placeholder="请输入地址搜索" v-model="search_keyword" class="input-with-select"></el-input>
  241. <div style="height: 15px;"></div>
  242. <baidu-map :center="map_point_set" :zoom="16" ref="map_com" style="position: relative; height: 315px;"
  243. @tilesloaded="tilesloaded" v-if="map_show_s" scroll-wheel-zoom>
  244. <!-- 缩放组件 -->
  245. <bm-navigation anchor="BMAP_ANCHOR_TOP_RIGHT"></bm-navigation>
  246. <!-- 标记点 -->
  247. <bm-marker :position="point_set" :dragging="true" @dragging="_point_set"></bm-marker>
  248. <bm-circle :center="point_set" :radius="point_radius" stroke-color="blue" :stroke-opacity="0.5" :stroke-weight="1" :editing="false"></bm-circle>
  249. <bm-local-search
  250. v-show="panel_show"
  251. @infohtmlset="select_point"
  252. style="position: absolute; top:-15px; width:100%; height: 315px; overflow-y: scroll; background-color: #fff;"
  253. :keyword="search_keyword"
  254. ></bm-local-search>
  255. </baidu-map>
  256. <baidu-map class="map" :scroll-wheel-zoom="true" :center="map_point_set" :zoom="16" style="position: relative;" @tilesloaded="tilesloaded" v-if="map_show" scroll-wheel-zoom>
  257. <bm-navigation anchor="BMAP_ANCHOR_TOP_RIGHT"></bm-navigation>
  258. <bm-marker :position="point_set" :dragging="true" @dragging="_point_set"></bm-marker>
  259. <bm-circle :center="point_set" :radius="point_radius" stroke-color="blue" :stroke-opacity="0.5" :stroke-weight="1" :editing="false"></bm-circle>
  260. </baidu-map>
  261. <div style="margin-top:15px;">
  262. 有效打卡范围:
  263. <el-select v-model="point_radius">
  264. <el-option label="100米" :value="100"></el-option>
  265. <el-option label="200米" :value="200"></el-option>
  266. <el-option label="300米" :value="300"></el-option>
  267. <el-option label="400米" :value="400"></el-option>
  268. <el-option label="500米" :value="500"></el-option>
  269. <el-option label="600米" :value="600"></el-option>
  270. <el-option label="700米" :value="700"></el-option>
  271. </el-select>
  272. </div>
  273. <span slot="footer" class="dialog-footer">
  274. <div class="flex-box-end">
  275. <el-button @click="MapBoxDialogVisible = false">取 消</el-button>
  276. <el-button type="primary" @click="saveLocationInfo">保 存</el-button>
  277. </div>
  278. </span>
  279. </div>
  280. </el-dialog>
  281. <el-dialog :close-on-click-modal="false" title="查看设置地点" :visible.sync="isShowMap" width="700px">
  282. <div v-loading="bdMap_loading">
  283. <div style="margin-bottom: 20px; text-align: center; font-weight: 600;">{{mapData.name2}}</div>
  284. <baidu-map :center="mapJw" :zoom="16" ref="map_com" style="height: 315px;" @tilesloaded="tilesloaded" scroll-wheel-zoom>
  285. <!-- 缩放组件 -->
  286. <bm-navigation anchor="BMAP_ANCHOR_TOP_RIGHT"></bm-navigation>
  287. <!-- 标记点 -->
  288. <bm-marker :position="mapJw"></bm-marker>
  289. <bm-circle :center="mapJw" :radius="mapData.radius" stroke-color="blue" :stroke-opacity="0.5" :stroke-weight="1" :editing="false"></bm-circle>
  290. </baidu-map>
  291. <div style="padding-top: 20px;font-weight: 600;">地点:{{mapData.name}}</div>
  292. <div style="padding: 20px 0;font-weight: 600;" >有效打卡范围:{{mapData.radius}}米</div>
  293. <span slot="footer" class="dialog-footer">
  294. <div class="flex-box-end">
  295. <el-button type="warning" @click="isShowMap = false">关闭</el-button>
  296. </div>
  297. </span>
  298. </div>
  299. </el-dialog>
  300. <el-dialog :close-on-click-modal="false" title="必须打卡的日期" :visible.sync="DateMustDialogVisible" width="400px">
  301. <Calendar v-on:choseDay="choseDaydate_must" :markDate="date_must"></Calendar>
  302. <span slot="footer" class="dialog-footer"><el-button type="primary" @click="DateMustSave">确 定</el-button></span>
  303. </el-dialog>
  304. <el-dialog :close-on-click-modal="false" title="不用打卡的日期" :visible.sync="DateNotDialogVisible" width="400px">
  305. <Calendar v-on:choseDay="choseDaydate_not" :markDate="date_not"></Calendar>
  306. <span slot="footer" class="dialog-footer"><el-button type="primary" @click="DateNotSave">确 定</el-button></span>
  307. </el-dialog>
  308. <EmployeeSelector
  309. :title="'选择参与人员'"
  310. :isChecKedAll="true"
  311. :selected="selected0"
  312. :multi="true"
  313. :visible.sync="EmployeeSelectorDialogVisible0"
  314. :close_clear_data="false"
  315. @confirm="EmployeeSelectorSave0"
  316. ></EmployeeSelector>
  317. <EmployeeSelector
  318. :title="'选择不参与人员'"
  319. :close_clear_data="false"
  320. :user_employee_list="true"
  321. :employee_list="selected0.employee"
  322. :isChecKedAll="true"
  323. :selected="selected1"
  324. :visible.sync="EmployeeSelectorDialogVisible1"
  325. @confirm="EmployeeSelectorSave1"
  326. ></EmployeeSelector>
  327. <EmployeeSelector
  328. :title="'选择考勤管理员'"
  329. :selected="selected2"
  330. :close_clear_data="false"
  331. :visible.sync="EmployeeSelectorDialogVisible2"
  332. @confirm="EmployeeSelectorSave2"
  333. ></EmployeeSelector>
  334. <el-dialog :close-on-click-modal="false" title="选择班次" :visible.sync="class_selectorDialogVisible" width="800px" top="50px">
  335. <class_selector v-if="class_selectorDialogVisible" :selected="attendance_setting_ids" :select_list.sync="attendance_setting_list" :select_ids.sync="attendance_setting_ids"></class_selector>
  336. <span slot="footer" class="dialog-footer"><el-button type="primary" @click="class_selector_save">确 定</el-button></span>
  337. </el-dialog>
  338. <el-dialog :close-on-click-modal="false" title="排班表" :visible.sync="attendance_dutyDialogVisible" width="90%" top="50px">
  339. <template slot="title">
  340. <div style="font-size: 18px;">排班表</div>
  341. <span style="margin-top: 10px;color: #2dac2d;display: inline-block;">注:*新增和修改排班时,仅支持修改未来的排班(今天及以前的修改不会保存),请提前规划并设置好排班*</span>
  342. </template>
  343. <attendance_duty ref="attendance_duty_com" @saved="save_success"></attendance_duty>
  344. <span slot="footer" class="dialog-footer"><el-button type="primary" @click="attendance_duty_save" :loading="attendance_duty_save_loading">保 存</el-button></span>
  345. </el-dialog>
  346. <changeCorde @changDialog="changDialog" :group_id="group_id" :showDialog="showDialog" />
  347. </div>
  348. </template>
  349. <script>
  350. import Vue from 'vue';
  351. import BaiduMap from 'vue-baidu-map';
  352. import Calendar from 'vue-calendar-component';
  353. import class_selector from '@/point/views/attendance/class_selectornew';
  354. import attendance_duty from '@/point/views/attendance/attendance_dutynew';
  355. import changeCorde from '@/point/views/attendance/attendance_dialognew'; // 考勤设置弹框
  356. import EmployeeSelector from '@/components/EmployeeSelector'; // 考勤设置弹框
  357. Vue.use(BaiduMap, { ak: 'QMDvD2Anle2gLOINIBUZ1Lhh' });
  358. export default {
  359. components: {
  360. Calendar,
  361. EmployeeSelector,
  362. class_selector,
  363. attendance_duty,
  364. changeCorde
  365. },
  366. watch: {
  367. isShowMap(val){
  368. if(!val){
  369. this.mapData={};
  370. this.bdMap_loading = false;
  371. this.mapJw={lng: 116.404, lat: 39.915};
  372. }
  373. },
  374. attendance_setting_list(val, old) {},
  375. search_keyword: function(n, o) {
  376. if (n != '') {
  377. this.panel_show = true;
  378. this.map_show_s = true;
  379. this.map_show = false;
  380. } else {
  381. this.map_show_s = false;
  382. this.map_show = true;
  383. }
  384. },
  385. work_date_length: function(n, o) {
  386. const work_date = [];
  387. let setting_id = 0;
  388. for (let i = 0; i < n; i++) {
  389. if (i < this.formdata.work_date.length) {
  390. setting_id = this.formdata.work_date[i].setting_id;
  391. } else {
  392. setting_id = 0;
  393. }
  394. work_date.push({ name: '第' + (i + 1) + '天', setting_id: setting_id });
  395. }
  396. this.formdata.work_date = work_date;
  397. },
  398. 'formdata.type': function(n, o) {
  399. const work_date = [];
  400. if (n != 1) {
  401. this.formdata.work_date = [
  402. { name: '周一', setting_id: 0 },
  403. { name: '周二', setting_id: 0 },
  404. { name: '周三', setting_id: 0 },
  405. { name: '周四', setting_id: 0 },
  406. { name: '周五', setting_id: 0 },
  407. { name: '周六', setting_id: 0 },
  408. { name: '周日', setting_id: 0 }
  409. ];
  410. } else {
  411. for (let i = 0; i < this.work_date_length; i++) {
  412. work_date.push({ name: '第' + (i + 1) + '天', setting_id: this.formdata.work_date[i].setting_id });
  413. }
  414. this.formdata.work_date = work_date;
  415. }
  416. }
  417. },
  418. data() {
  419. const validateName = (rule, value, callback) => {
  420. var validValue = value ? value.replace(/\s/g, '').replace(/&nbsp;/gi, '') : value;
  421. if (!validValue) {
  422. return callback(new Error('请填写积分分类名称'));
  423. } else {
  424. callback();
  425. }
  426. };
  427. return {
  428. show_dept_selector: [],
  429. isChose: false,
  430. baseurl: this.$serveAd,
  431. formrule: {
  432. name: [{ required: true, message: '请输入名称' }],
  433. employee_ids: [{ required: true, message: '请选择参与人员'}],
  434. manager_ids: [{ required: true, message: '请选择管理员'}],
  435. overtime_rule: [{ required: true, message: '请选择加班规则'}]
  436. },
  437. tag: false,
  438. group_id: 0,
  439. showDialog: false, // 控制考勤设置弹窗
  440. attendance_duty_save_loading: false,
  441. class_selectorDialogVisible: false,
  442. attendance_dutyDialogVisible: false,
  443. save_loading: false,
  444. EmployeeSelectorDialogVisible0: false,
  445. EmployeeSelectorDialogVisible1: false,
  446. EmployeeSelectorDialogVisible2: false,
  447. DateMustDialogVisible: false,
  448. DateNotDialogVisible: false,
  449. is_out_attendance: true,
  450. location_name: '',
  451. location_details: '',
  452. map_show_s: true,
  453. map_show: false,
  454. search_location: '',
  455. search_keyword: '',
  456. panel_show: false,
  457. map_point_set: { lng: 116.404, lat: 39.915 },
  458. point_set: { lng: 116.404, lat: 39.915 },
  459. point_radius: 300,
  460. MapBoxDialogVisible: false,
  461. dialog_title: '创建考勤组',
  462. work_date_length: 2,
  463. work_date_list: [],
  464. employee_ids: [],
  465. un_employee_ids: [],
  466. manager_ids: [],
  467. employee_list: [],
  468. un_employee_list: [],
  469. manager_list: [],
  470. attendance_setting_list: [], // 班次列表
  471. attendance_setting_ids: [], // 班次列表id
  472. date_must_arr: [],
  473. attendance_setting_list_must: [],
  474. formdata: {
  475. name: '',
  476. employee_ids: [], // 参与人员id
  477. employee: [],
  478. manager_ids: [],
  479. manager: [], // 考勤管理yuan
  480. un_employee_ids: '',
  481. un_employee: [], // 不参与人员
  482. attendance_setting_ids: [],
  483. attendance_setting_list: [],
  484. work_date: [
  485. { name: '周一', setting_id: 0 },
  486. { name: '周二', setting_id: 0 },
  487. { name: '周三', setting_id: 0 },
  488. { name: '周四', setting_id: 0 },
  489. { name: '周五', setting_id: 0 },
  490. { name: '周六', setting_id: 0 },
  491. { name: '周日', setting_id: 0 }
  492. ],
  493. date_must: [], // 必须打卡日期
  494. date_not: [], // 不必须打卡日期
  495. type: 0,
  496. location_range: 300, // 打卡半径
  497. location: [], // 打卡位置
  498. overtime_rule: 0 // 加班规则
  499. },
  500. date_must: [],
  501. date_not: [],
  502. multipleSelection: [],
  503. RuleDetailDialogVisible: false,
  504. pageLimit: 10,
  505. profile: this.$store.getters.user_info,
  506. filter: {
  507. status: 1,
  508. keywords: '',
  509. employee_id: null
  510. },
  511. overtime_rule_list: [],
  512. form_api: '/integral.php/attendance_group/create_attend_group',
  513. loading: false,
  514. totalCount: 0,
  515. currentPage: 1,
  516. tableData: null,
  517. groupId: '',
  518. rules: {
  519. name: [{ validator: validateName, trigger: 'blur' }]
  520. },
  521. selected0: { employee: [], dept: [] },
  522. selected1: { employee: [], dept: [] },
  523. selected2: { employee: [], dept: [] },
  524. bdMap_loading: true,
  525. // 打开设置好的地点相关
  526. isShowMap:false,
  527. mapData:{},
  528. mapJw:{lng: 116.404, lat: 39.915},
  529. employee_map: '', //人员列表
  530. };
  531. },
  532. methods: {
  533. inits(){
  534. let obj_map = Object.values(this.$getEmployeeMap())
  535. let arr = obj_map.filter( x => this.$supremeAuthority(null,x.id) != 'creator')//去掉创始人
  536. this.employee_map = arr;
  537. },
  538. employeSearch(val){
  539. this.currentPage = 1;
  540. this.loadRuleList();
  541. },
  542. // 打开设置好的地图
  543. openMap(i){
  544. this.mapJw={ lng: i.lng, lat:i.lat };
  545. this.mapData=i;
  546. this.bdMap_loading = true;
  547. this.$nextTick(()=>{
  548. this.isShowMap=true;
  549. })
  550. },
  551. tilesloaded() {
  552. this.bdMap_loading = false;
  553. },
  554. location_del(index) {
  555. this.formdata.location.splice(index, 1);
  556. },
  557. // 打开排班表
  558. attendance_duty_show(id) {
  559. const self = this;
  560. this.attendance_dutyDialogVisible = true;
  561. this.$nextTick(function() {
  562. self.$refs['attendance_duty_com'].get_group_info(id);
  563. });
  564. },
  565. attendance_duty_save() {
  566. const self = this;
  567. self.attendance_duty_save_loading = true;
  568. self.$refs['attendance_duty_com'].send_schedule();
  569. },
  570. save_success() {
  571. const self = this;
  572. self.attendance_duty_save_loading = false;
  573. self.attendance_dutyDialogVisible = false;
  574. },
  575. class_selector_save() {
  576. for (let i in this.formdata.attendance_setting_ids) {
  577. this.formdata.attendance_setting_ids[i] = Number(this.formdata.attendance_setting_ids[i]);
  578. }
  579. for (const l in this.attendance_setting_list) {
  580. if (this.formdata.attendance_setting_ids.indexOf(this.attendance_setting_list[l].id) < 0) {
  581. this.formdata.attendance_setting_ids.push(this.attendance_setting_list[l].id);
  582. this.formdata.attendance_setting_list.push({ name: this.attendance_setting_list[l].name, value: this.attendance_setting_list[l].id });
  583. }
  584. }
  585. this.setMustDateArr();
  586. this.class_selectorDialogVisible = false;
  587. },
  588. class_selector_show() {
  589. this.class_selectorDialogVisible = true;
  590. },
  591. EmployeeSelector0_show() {
  592. this.EmployeeSelectorDialogVisible0 = true;
  593. },
  594. EmployeeSelector1_show() {
  595. this.EmployeeSelectorDialogVisible1 = true;
  596. },
  597. EmployeeSelector2_show() {
  598. this.EmployeeSelectorDialogVisible2 = true;
  599. },
  600. set_manager_ids(data) {
  601. this.manager_list = data;
  602. },
  603. set_un_employee_ids(data) {
  604. this.un_employee_list = data;
  605. },
  606. set_employee_ids(data) {
  607. this.employee_list = data;
  608. },
  609. EmployeeSelectorSave0(data) {
  610. this.EmployeeSelectorDialogVisible0 = false;
  611. //this.employee_list = data.employee
  612. this.employee_list = JSON.parse(JSON.stringify(data.employee));
  613. let selectedLing = this.selected0.employee;
  614. let differenceValue = selectedLing.filter(a => !this.employee_list.some(b => b.id == a.id));
  615. if (this.employee_list != 0) {
  616. for (let i in this.formdata.un_employee) {
  617. for (let a in differenceValue) {
  618. if (this.formdata.un_employee[i].id == differenceValue[a].id) {
  619. this.formdata.un_employee.splice(i, 1);
  620. }
  621. }
  622. }
  623. let un_employeeList = [];
  624. for (let i in this.formdata.un_employee) {
  625. un_employeeList.push(this.formdata.un_employee[i].id);
  626. }
  627. this.formdata.un_employee_ids = un_employeeList;
  628. } else {
  629. this.formdata.un_employee = [];
  630. this.formdata.un_employee_ids = [];
  631. }
  632. this.selected1.employee = this.formdata.un_employee;
  633. this.selected0 = data;
  634. this.formdata.employee = [];
  635. this.formdata.employee_ids = [];
  636. if (this.employee_list.length != 0) {
  637. for (const i in this.employee_list) {
  638. this.formdata.employee.push(this.employee_list[i]);
  639. this.formdata.employee_ids.push(this.employee_list[i].id);
  640. }
  641. }
  642. },
  643. handleSelectionChange: function(val) {
  644. this.multipleSelection = val;
  645. },
  646. EmployeeSelectorSave1(data) {
  647. this.EmployeeSelectorDialogVisible1 = false;
  648. this.un_employee_list = JSON.parse(JSON.stringify(data.employee));
  649. this.selected1 = data;
  650. this.formdata.un_employee = [];
  651. this.formdata.un_employee_ids = [];
  652. if (this.un_employee_list.length != 0) {
  653. for (const i in this.un_employee_list) {
  654. this.formdata.un_employee.push(this.un_employee_list[i]);
  655. this.formdata.un_employee_ids.push(this.un_employee_list[i].id);
  656. }
  657. }
  658. },
  659. EmployeeSelectorSave2(data) {
  660. this.EmployeeSelectorDialogVisible2 = false;
  661. this.manager_list = JSON.parse(JSON.stringify(data.employee));
  662. this.formdata.manager_ids = this.formdata.manager_ids.map(item => (item = Number(item)));
  663. this.selected2 = data;
  664. this.formdata.manager = [];
  665. this.formdata.manager_ids = [];
  666. if (this.manager_list.length != 0) {
  667. for (const i in this.manager_list) {
  668. this.formdata.manager.push(this.manager_list[i]);
  669. this.formdata.manager_ids.push(this.manager_list[i].id);
  670. // }
  671. }
  672. }
  673. },
  674. choseDaydate_must(data) {
  675. if (this.formdata.date_not.indexOf(data) >= 0) {
  676. this.$message.error('当前日期已被选中为“不用打卡日期”');
  677. return;
  678. }
  679. if (this.formdata.date_must.indexOf(data) >= 0) {
  680. this.$message.error('当前日期已被选中');
  681. return;
  682. }
  683. if (this.date_must.indexOf(data) >= 0) {
  684. this.date_must.splice(this.date_must.indexOf(data), 1);
  685. } else {
  686. this.date_must.push(data);
  687. }
  688. },
  689. choseDaydate_not(data) {
  690. if (this.formdata.date_must.indexOf(data) >= 0) {
  691. this.$message.error('当前日期已被选中为“必须打卡日期”');
  692. return;
  693. }
  694. if (this.date_not.indexOf(data) >= 0 || this.formdata.date_not.indexOf(data) >= 0) {
  695. this.$message.error('当前日期已被选中');
  696. return;
  697. }
  698. if (this.date_not.indexOf(data) >= 0) {
  699. this.date_not.splice(this.date_not.indexOf(data), 1);
  700. } else {
  701. this.date_not.push(data);
  702. }
  703. },
  704. DateNotShow() {
  705. this.date_not = [];
  706. this.DateNotDialogVisible = true;
  707. },
  708. DateMustShow() {
  709. this.date_must = [];
  710. this.DateMustDialogVisible = true;
  711. },
  712. DateNotSave() {
  713. this.DateNotDialogVisible = false;
  714. for (const i in this.date_not) {
  715. if (this.formdata.date_not.indexOf(this.date_not[i]) < 0) {
  716. this.formdata.date_not.push(this.date_not[i]);
  717. }
  718. }
  719. },
  720. DateMustSave() {
  721. this.DateMustDialogVisible = false;
  722. for (const i in this.date_must) {
  723. if (this.formdata.date_must.indexOf(this.date_must[i]) < 0) {
  724. this.formdata.date_must.push(this.date_must[i]);
  725. }
  726. }
  727. this.setMustDateArr();
  728. },
  729. setMustDateArr() {
  730. const attendance_setting_list_must = {};
  731. for (const i in this.formdata.date_must) {
  732. attendance_setting_list_must[this.formdata.date_must[i]] = [];
  733. for (const item in this.formdata.attendance_setting_list) {
  734. attendance_setting_list_must[this.formdata.date_must[i]].push({
  735. label: this.formdata.date_must[i] + '(' + this.formdata.attendance_setting_list[item].label + ')',
  736. value: this.formdata.date_must[i] + ':' + this.formdata.attendance_setting_list[item].value
  737. });
  738. }
  739. }
  740. this.attendance_setting_list_must = attendance_setting_list_must;
  741. },
  742. saveLocationInfo() {
  743. if (this.location_name == '') {
  744. this.$message.error('搜索地址名称或者拖动地图中的红色标签确定位置');
  745. return;
  746. }
  747. this.formdata.location.push({ lat: this.point_set.lat, lng: this.point_set.lng, name: this.location_name, radius: this.point_radius,name2:this.search_keyword });
  748. this.MapBoxDialogVisible = false;
  749. },
  750. // 拖动标记点
  751. _point_set(a) {
  752. const _this = this;
  753. this.point_set = a.point;
  754. const geoc = new BMap.Geocoder();
  755. geoc.getLocation(a.point, function(rs) {
  756. const addComp = rs.addressComponents;
  757. _this.location_name = addComp.province + ' ' + addComp.city + ' ' + addComp.district + ' ' + addComp.street + ' ' + addComp.streetNumber;
  758. });
  759. },
  760. // 搜索地点
  761. select_point(p) {
  762. const _this = this;
  763. const geoc = new BMap.Geocoder();
  764. geoc.getLocation(p.point, function(rs) {
  765. const addComp = rs.addressComponents;
  766. _this.location_name = addComp.province + ' ' + addComp.city + ' ' + addComp.district + ' ' + addComp.street + ' ' + addComp.streetNumber;
  767. });
  768. this.point_set = p.point;
  769. this.map_point_set = p.point;
  770. this.search_keyword=p.title;
  771. this.panel_show = false;
  772. setTimeout(function() {
  773. _this.map_show = true;
  774. _this.map_show_s = false;
  775. }, 200);
  776. },
  777. show_map_com() {
  778. const _this = this;
  779. this.MapBoxDialogVisible = true;
  780. },
  781. // 必打卡日期选择班次
  782. selectDate() {},
  783. date_must_delete(tag, index) {
  784. this.formdata.date_must.splice(index, 1);
  785. this.date_must_arr.splice(index, 1);
  786. },
  787. changeTag() {},
  788. date_not_delete(tag, index) {
  789. this.formdata.date_not.splice(index, 1);
  790. },
  791. employee_delete(id, index) {
  792. for (let i in this.formdata.un_employee) {
  793. if (this.formdata.un_employee[i].id == id) {
  794. this.formdata.un_employee.splice(i, 1);
  795. }
  796. }
  797. let un_employeeList = [];
  798. for (let i in this.formdata.un_employee) {
  799. un_employeeList.push(this.formdata.un_employee[i].id);
  800. }
  801. this.formdata.un_employee_ids = un_employeeList;
  802. this.formdata.employee.splice(index, 1);
  803. this.selected0.employee = this.formdata.employee;
  804. const employee_ids = [];
  805. for (const e in this.formdata.employee) {
  806. employee_ids.push(this.formdata.employee[e].id);
  807. }
  808. this.formdata.employee_ids = employee_ids;
  809. },
  810. // 不参与人员
  811. un_employee_delete(id, index) {
  812. this.formdata.un_employee.splice(index, 1);
  813. this.selected1.employee = this.formdata.un_employee;
  814. const employee_ids = [];
  815. for (const e in this.formdata.un_employee) {
  816. employee_ids.push(this.formdata.un_employee[e].id);
  817. }
  818. this.formdata.un_employee_ids = employee_ids;
  819. },
  820. // 考勤管理员
  821. manager_delete(id, index) {
  822. this.formdata.manager.splice(index, 1);
  823. this.selected2.employee = this.formdata.manager;
  824. const employee_ids = [];
  825. for (const e in this.formdata.manager) {
  826. employee_ids.push(this.formdata.manager[e].id);
  827. }
  828. this.formdata.manager_ids = employee_ids;
  829. },
  830. attendance_setting_delete(e, index) {
  831. this.formdata.attendance_setting_list.splice(index, 1);
  832. const attendance_setting_ids = [];
  833. for (const i in this.formdata.attendance_setting_list) {
  834. attendance_setting_ids.push(this.formdata.attendance_setting_list[i].value);
  835. }
  836. this.formdata.attendance_setting_ids = attendance_setting_ids;
  837. },
  838. confirmMultipleDelete() {
  839. if (this.multipleSelection.length < 1) {
  840. return false;
  841. }
  842. this.$confirm('确定要删除选中的考勤组吗?', '批量删除考勤组', {
  843. confirmButtonText: '确定',
  844. cancelButtonText: '取消',
  845. type: 'warning'
  846. })
  847. .then(() => {
  848. const targetArr = [];
  849. for (const index in this.multipleSelection) {
  850. targetArr.push(this.multipleSelection[index].id);
  851. }
  852. const targetIds = targetArr.join(',');
  853. this.deleteRule(targetIds, true);
  854. })
  855. .catch(() => {});
  856. },
  857. handleSizeChange(val) {
  858. this.pageLimit = val;
  859. this.onFilterChanged();
  860. },
  861. formReset() {
  862. const _this = this;
  863. },
  864. onFilterChanged: function() {
  865. this.currentPage = 1;
  866. this.loadRuleList();
  867. },
  868. // 获取规则列表
  869. loadRuleList: function() {
  870. var self = this;
  871. self.loading = true;
  872. var params = {
  873. page: this.currentPage,
  874. page_size: this.pageLimit,
  875. keyword: self.filter.keywords,
  876. employee_id: self.filter.employee_id,
  877. };
  878. this.$axiosKq('get','/ad/group', params
  879. )
  880. .then(function(response) {
  881. if (response.status == 200) {
  882. self.loading = false;
  883. var jsonData = response.data;
  884. try {
  885. self.totalCount = jsonData.data.total;
  886. self.tableData = jsonData.data.list;
  887. } catch (err) {}
  888. }
  889. });
  890. },
  891. changePage: function(current) {
  892. if (isNaN(current) || current < 1) {
  893. return false;
  894. }
  895. this.loadRuleList();
  896. },
  897. // 创建修改考勤组
  898. saveFormData: function() {
  899. // this.save_loading = true
  900. var self = this;
  901. const send_data = JSON.parse(JSON.stringify(this.formdata));
  902. const work_date = [];
  903. for (const i in send_data.work_date) {
  904. work_date.push(send_data.work_date[i].setting_id);
  905. }
  906. // send_data.date_must = self.date_must_arr
  907. if (send_data.type == 2) {
  908. // 自由上下班
  909. send_data.work_date = self.work_date_list;
  910. } else {
  911. send_data.work_date = work_date;
  912. }
  913. if (self.is_out_attendance) {
  914. send_data['is_out_attendance'] = 1;
  915. } else {
  916. send_data['is_out_attendance'] = 0;
  917. }
  918. let newarray = [];
  919. for (let i = 0; i < send_data.date_must.length; i++) {
  920. // newarray.push(send_data.date_must[i]+ ':' + self.date_must_arr[i]);
  921. newarray.push(send_data.date_must[i]);
  922. }
  923. var params = {
  924. name: '',
  925. schedule_ids: '', // 班次ID集合,如 2,24,1
  926. employee_ids: '', // 考情id
  927. manager_ids: '', // 考勤组管理员ID
  928. un_employee_ids: '', // 不参与人员
  929. work_date: '', // 排班周期每天的班次ID,逗号隔开,如 2,24,1 当type为2时,使用1-7来说明周一至周日是否上班
  930. date_must: '', // 必打卡日期
  931. date_not: '', // 不比打卡日期
  932. type: 0, // 考勤组类型,0固定班制,1排班制,2自由上下班
  933. location_list: [], //考勤打卡的地点和范围,如[{name: “东莞市莞太路34号”, lng: 23.836343, lat: 113.3734643, radius: 300}]
  934. is_out_attendance: 0, // 是否允许外勤打卡,1是,0否
  935. overtime_rule: '' // 加班规则ID
  936. };
  937. params.schedule_ids = send_data.attendance_setting_ids.join(',');
  938. params.name = send_data.name;
  939. params.employee_ids = send_data.employee_ids.join(',');
  940. params.manager_ids = send_data.manager_ids.join(',');
  941. params.un_employee_ids = send_data.un_employee_ids.join(',');
  942. params.work_date = send_data.work_date.join(',');
  943. params.date_must = newarray.join(',');
  944. params.date_not = send_data.date_not.join(',');
  945. params.type = send_data.type;
  946. params.location_list = send_data.location;
  947. params.is_out_attendance = send_data.is_out_attendance;
  948. params.overtime_rule = send_data.overtime_rule;
  949. if (self.groupId > 0) {
  950. params.id = self.groupId;
  951. }
  952. if (self.is_out_attendance) {
  953. send_data['is_out_attendance'] = 1;
  954. } else {
  955. send_data['is_out_attendance'] = 0;
  956. }
  957. if (params.name == '') {
  958. this.$message({
  959. message: '请输入考勤组名称',
  960. type: 'error'
  961. });
  962. return false;
  963. } else if (params.employee_ids == '') {
  964. this.$message({
  965. message: '请选择参与人员',
  966. type: 'error'
  967. });
  968. return false;
  969. }
  970. else if (params.overtime_rule == '') {
  971. this.$message({
  972. message: '请选择加班规则',
  973. type: 'error'
  974. });
  975. return false;
  976. }
  977. this.$axiosKq('post',this.form_api,params)
  978. .then(function(response) {
  979. self.save_loading = false;
  980. if (response.status == 200) {
  981. if (response.data.code == 1) {
  982. self.RuleDetailDialogVisible = false;
  983. self.onFilterChanged();
  984. self.$message.success(response.data.msg);
  985. } else {
  986. self.$message.error(response.data.msg);
  987. }
  988. }
  989. })
  990. },
  991. confirmDelete: function(ruleId) {
  992. this.$confirm('确定要删除此考勤组吗?', '删除考勤组', {
  993. confirmButtonText: '确定',
  994. cancelButtonText: '取消',
  995. type: 'warning'
  996. })
  997. .then(() => {
  998. this.deleteRule(ruleId);
  999. })
  1000. .catch(() => {});
  1001. },
  1002. // 获取默认规则
  1003. get_overtime_list() {
  1004. const self = this;
  1005. var params = { page: 1, page_size: 1000, interval: 1000 };
  1006. this.$axiosKq('get','/ad/over_time_rule',params).then(res => {
  1007. if (res.status == 200) {
  1008. self.overtime_rule_list = res.data.data.list;
  1009. }
  1010. });
  1011. },
  1012. // 删除考情组
  1013. deleteRule: function(ruleId) {
  1014. if (!ruleId) {
  1015. return false;
  1016. }
  1017. const params = { id: ruleId };
  1018. var self = this;
  1019. this.$axiosKq('get','/ad/group/delete',params)
  1020. .then(function(response) {
  1021. if (response.status == 200 && response.data.code == 1) {
  1022. self.$message.success(response.data.msg);
  1023. self.loadRuleList();
  1024. } else {
  1025. // self.$message.error('网络错误');
  1026. }
  1027. })
  1028. .catch(function(error) {});
  1029. },
  1030. corde: function(data) {
  1031. this.group_id = data.id;
  1032. this.showDialog = true;
  1033. },
  1034. changDialog: function() {
  1035. this.showDialog = false;
  1036. this.loadRuleList();
  1037. },
  1038. // 修改创建打开窗口 获取详情
  1039. toDetailPage: function(id, event) {
  1040. const self = this;
  1041. self.date_must_arr = [];
  1042. self.formdata = {
  1043. name: '',
  1044. employee_ids: [],
  1045. employee: [],
  1046. manager_ids: [],
  1047. manager: [],
  1048. un_employee_ids: [],
  1049. un_employee: [],
  1050. attendance_setting_ids: [],
  1051. attendance_setting_list: [],
  1052. work_date: [
  1053. { name: '周一', setting_id: 0 },
  1054. { name: '周二', setting_id: 0 },
  1055. { name: '周三', setting_id: 0 },
  1056. { name: '周四', setting_id: 0 },
  1057. { name: '周五', setting_id: 0 },
  1058. { name: '周六', setting_id: 0 },
  1059. { name: '周日', setting_id: 0 }
  1060. ],
  1061. date_must: [],
  1062. date_not: [],
  1063. type: 0,
  1064. location_range: 300,
  1065. location: [],
  1066. overtime_rule: ''
  1067. };
  1068. let newdate = [
  1069. { name: '周一', setting_id: 0 },
  1070. { name: '周二', setting_id: 0 },
  1071. { name: '周三', setting_id: 0 },
  1072. { name: '周四', setting_id: 0 },
  1073. { name: '周五', setting_id: 0 },
  1074. { name: '周六', setting_id: 0 },
  1075. { name: '周日', setting_id: 0 }
  1076. ];
  1077. if (id > 0) {
  1078. self.groupId = id;
  1079. self.isChose = true;
  1080. this.form_api ='/ad/group/update'; // 确认修改
  1081. this.tag = true;
  1082. this.dialog_title = '修改考勤组';
  1083. // 获取一条记录,用于复原修改界面
  1084. this.$axiosKq('get','/ad/group/info',{ id: id }).then(res => {
  1085. if (res.status == 200) {
  1086. self.is_out_attendance = res.data.data.is_out_attendance == 1;
  1087. self.formdata.name = res.data.data.name;
  1088. self.formdata.date_must = res.data.data.date_must.split(',');
  1089. self.formdata.employee_ids = res.data.data.employee_ids.split(',');
  1090. self.formdata.employee = res.data.data.employees;
  1091. self.selected0.employee = res.data.data.employees;
  1092. self.formdata.manager = res.data.data.managers;
  1093. self.selected2.employee = res.data.data.managers;
  1094. self.formdata.un_employee = res.data.data.un_employees;
  1095. self.selected1.employee = res.data.data.un_employees;
  1096. self.formdata.manager_ids = res.data.data.manager_ids.split(',');
  1097. let work_date_list = res.data.data.work_date.split(','); // 返回选中班次id
  1098. let schedules = res.data.data.schedules;
  1099. self.formdata.un_employee_ids = res.data.data.un_employee_ids.split(',');
  1100. if (res.data.data.type == 0) {
  1101. for (const i in work_date_list) {
  1102. self.formdata.work_date[i].setting_id = work_date_list[i] * 1;
  1103. }
  1104. }
  1105. // 排班制
  1106. if (res.data.data.type == 1) {
  1107. self.formdata.work_date = [];
  1108. self.work_date_length = res.data.data.work_date.split(',').length; // 排班周期
  1109. for (const i in work_date_list) {
  1110. self.formdata.work_date.push({ name: '第' + (i * 1 + 1) + '天', setting_id: work_date_list[i] * 1 });
  1111. }
  1112. }
  1113. // 固定轮休
  1114. if (res.data.data.type == 2) {
  1115. self.work_date_list = work_date_list.map(function(item) {
  1116. return 1 * item;
  1117. });
  1118. }
  1119. self.attendance_setting_list = res.data.data.schedules;
  1120. let newSetting = [];
  1121. for (let i = 0; i < res.data.data.schedules.length; i++) {
  1122. self.attendance_setting_list[i].value = res.data.data.schedules[i].id;
  1123. newSetting.push({});
  1124. newSetting[i].value = res.data.data.schedules[i].id;
  1125. newSetting[i].name = res.data.data.schedules[i].name;
  1126. }
  1127. self.formdata.attendance_setting_list = newSetting;
  1128. self.attendance_setting_ids = res.data.data.schedule_ids.split(',');
  1129. for (let i = 0; i < res.data.data.schedules.length; i++) {
  1130. }
  1131. self.formdata.attendance_setting_ids = res.data.data.schedule_ids.split(',');
  1132. self.formdata.overtime_rule = res.data.data.overtime_rule; // 默认规则
  1133. let newarray = [];
  1134. let newData = [];
  1135. let mustaRRAY = res.data.data.date_must_array;
  1136. for (let i = 0; i < mustaRRAY.length; i++) {
  1137. newarray.push(Number(mustaRRAY[i].schedule_id));
  1138. newData.push(mustaRRAY[i].date);
  1139. }
  1140. self.date_must_arr = newarray;
  1141. if(res.data.data.date_not){
  1142. self.formdata.date_not = res.data.data.date_not.split(',');
  1143. }
  1144. self.formdata.location = res.data.data.location_list;
  1145. self.formdata.type = res.data.data.type; // 考情类型
  1146. self.formdata.id = res.data.data.id;
  1147. self.RuleDetailDialogVisible = true;
  1148. self.setMustDateArr();
  1149. } else {
  1150. // self.$message.error('网络错误');
  1151. }
  1152. });
  1153. } else {
  1154. this.isChose = false;
  1155. this.tag = false;
  1156. this.RuleDetailDialogVisible = true;
  1157. //清空选人组件
  1158. (this.selected0 = { employee: [], dept: [] }),
  1159. (this.selected1 = { employee: [], dept: [] }),
  1160. (this.selected2 = { employee: [], dept: [] }),
  1161. (this.form_api ='/ad/group/add');
  1162. this.dialog_title = '创建考勤组';
  1163. }
  1164. }
  1165. },
  1166. created() {
  1167. this.inits()
  1168. this.get_overtime_list();
  1169. this.loadRuleList();
  1170. }
  1171. };
  1172. </script>
  1173. <style scoped>
  1174. .el-alert--success:hover{
  1175. background-color: #F5F5F5;
  1176. cursor: pointer;
  1177. }
  1178. .el-alert__content{
  1179. line-height: 24px;
  1180. }
  1181. .el-alert__closebtn{
  1182. width: 20px;
  1183. height: 20px;
  1184. font-size: 16px;
  1185. text-align: center;
  1186. line-height: 20px;
  1187. }
  1188. .el-alert__closebtn:hover{
  1189. background-color: #E65D6E;
  1190. border-radius: 50%;
  1191. color: #fff;
  1192. }
  1193. /deep/ .date_tag .el-tag + .el-tag {
  1194. margin: 5px;
  1195. }
  1196. /deep/ .attendance_group .el-card__body {
  1197. padding: 15px;
  1198. }
  1199. /deep/ .attendance_group .el-tag + .el-tag {
  1200. margin-left: 10px;
  1201. }
  1202. /deep/ .attendance_group .el-tag + .el-button {
  1203. margin-left: 10px;
  1204. }
  1205. .setMapBaidu .map {
  1206. width: 100%;
  1207. height: 300px;
  1208. }
  1209. .diy-input-on-border input {
  1210. background-color: transparent;
  1211. border: none;
  1212. }
  1213. /deep/ .wh_container .wh_content_all {
  1214. background: #5b8bf7;
  1215. }
  1216. </style>