123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629 |
- <template>
- <view class="flow-popup-content">
- <u-form ref="dataForm" :model="dataForm" :label-width="250" :errorType="['toast']">
- <view class="content">
- <u-form-item label="分支选择" prop="branchList" required v-if="isBranch">
- <JnpfSelect v-model="dataForm.branchList" @change="branchChange" placeholder="请选择审批分支"
- :options="branchList" multiple :props="props" />
- </u-form-item>
- <u-form-item class="back-item" label="退回节点" v-if="config.type === 'back' && config.backType"
- prop="backNodeCode" required>
- <view class="u-flex-col back-item-inner">
- <JnpfSelect v-model="dataForm.backNodeCode" :options="config.backNodeList" :props="props"
- :disabled="config.backNodeCode != 2" />
- <view class="u-m-t-20 selectNode u-flex" v-if="config.backType == 3">
- <u-radio-group v-model="dataForm.backType">
- <u-radio @change="radioChange(item)" v-for="(item, index) in list" :key="index"
- :name="item.name" :disabled="item.disabled">
- {{ item.fullName }}
- </u-radio>
- </u-radio-group>
- </view>
- </view>
- </u-form-item>
- <u-form-item label="转审给谁" prop="handleIds"
- v-if="['transfer'].includes(config.type) && propertiesType !== 'processing'" required>
- <JnpfUserSelect v-model=" dataForm.handleIds" />
- </u-form-item>
- <u-form-item label="转办给谁" prop="handleIds"
- v-if="['transfer'].includes(config.type) && propertiesType === 'processing'" required>
- <JnpfUserSelect v-model=" dataForm.handleIds" />
- </u-form-item>
- <u-form-item label="协办给谁" prop="handleVal" v-if="['assist'].includes(config.type)" required>
- <JnpfUserSelect v-model=" dataForm.handleVal" multiple @change="changeUserSelect" />
- </u-form-item>
- <view v-if="config.type === 'freeApprover'">
- <u-form-item label="加签人员" prop="addSignUserIdList" required>
- <JnpfUserSelect v-model="dataForm.addSignUserIdList" multiple />
- </u-form-item>
- <u-form-item label="加签类型">
- <JnpfSelect :options="typeList" v-model="dataForm.addSignType" @change="freeApproverChange" />
- </u-form-item>
- <u-form-item label="审批方式">
- <JnpfRadio v-model="dataForm.counterSign" :options="options" />
- </u-form-item>
- <u-form-item label="会签比例" v-if="dataForm.counterSign == 1">
- <view class="u-flex-col free-box">
- <JnpfSelect :options="ratioList" v-model="dataForm.auditRatio" />
- <text class="u-m-l-10 free-box-txt">达到会签比例则通过</text>
- </view>
- </u-form-item>
- </view>
- <template v-for="(item, index) in candidateList" :key="index" v-if="showCandidate">
- <u-form-item :label="item.nodeName+ '审批人'" :required="!item.selected" :border-bottom="false">
- <u-input type="select" v-model="item.fullName" placeholder="请选择审批候选人" input-align="right"
- @click="openSelect(item)" v-if="item.hasCandidates" />
- <JnpfUserSelect v-model="item.value" multiple placeholder="请选择审批候选人" v-else />
- </u-form-item>
- <u-form-item label="已选审批人" v-if="item.selected">
- <u-input type="textarea" v-model="item.selected" class="textarea" border disabled
- placeholder="" />
- </u-form-item>
- </template>
- <u-form-item v-if="showOpinion" :label="opinionTitle">
- <HandleOpinion :commonList="commonList" v-model="dataForm.handleOpinion"
- @addCommonWords="addCommonWords" :showCommon="false"></HandleOpinion>
- </u-form-item>
- <u-form-item prop="handleOpinion" required label-position="top" :label="opinionTitle"
- v-if="showApproval">
- <HandleOpinion :commonList="commonList" v-model="dataForm.handleOpinion"
- @addCommonWords="addCommonWords"></HandleOpinion>
- </u-form-item>
- <template v-if="config.approvalField.length">
- <u-form-item label-position="left" :label="item.fieldName"
- v-for="(item,index) in config.approvalField" :key="index">
- <JnpfInput v-if="item.jnpfKey=='input'" v-model="item.value" />
- <JnpfTextarea v-if="item.jnpfKey=='textarea'" v-model="item.value" />
- <JnpfInputNumber v-if="item.jnpfKey=='inputNumber'" v-model="item.value" />
- </u-form-item>
- </template>
- <u-form-item :prop="signRule ? 'signImg' : '' " :required="signRule" v-if="config.hasSign">
- <JnpfSign v-model="dataForm.signImg" signType="ApprovalSign" />
- </u-form-item>
- <!-- #ifndef APP-HARMONY -->
- <u-form-item v-if="config.hasFile">
- <view class="uploadFile">
- <JnpfUploadFile v-model="dataForm.fileList" :limit="3" align="left" />
- </view>
- </u-form-item>
- <!-- #endif -->
- <u-form-item label="抄送人员" v-if="showCustomCopy">
- <JnpfUserSelect v-model="copyIds" multiple />
- </u-form-item>
- </view>
- </u-form>
- <view class="flowBefore-actions">
- <CustomButton class="u-flex buttom-btn-left-inner" :btnText="$t('common.cancelText')"
- btnIcon="icon-ym icon-ym-add-cancel" customIcon />
- <u-button class="buttom-btn" type="primary" @click="confirm('confirm')">{{$t('common.okText')}}
- </u-button>
- </view>
- </view>
- </template>
- <script>
- import CustomButton from '@/components/CustomButton'
- import HandleOpinion from './components/HandleOpinion.vue'
- import {
- getSelector,
- Create
- } from '@/api/commonWords'
- export default {
- components: {
- HandleOpinion,
- CustomButton
- },
- data() {
- return {
- copyIds: [],
- selectList: [],
- candidateList: [],
- commonList: [],
- title: '',
- label: '',
- name: {
- 'reject': '拒绝',
- 'launchRecall': '撤回',
- 'auditRecall': '撤回',
- 'audit': '同意',
- 'back': '退回',
- 'freeApprover': '加签',
- 'transfer': '转审'
- },
- ratioList: [{
- fullName: '10%',
- id: 10
- }, {
- fullName: '20%',
- id: 20
- }, {
- fullName: '30%',
- id: 30
- }, {
- fullName: '40%',
- id: 40
- }, {
- fullName: '50%',
- id: 50
- }, {
- fullName: '60%',
- id: 60
- }, {
- fullName: '70%',
- id: 70
- }, {
- fullName: '80%',
- id: 80
- }, {
- fullName: '90%',
- id: 90
- }, {
- fullName: '100%',
- id: 100
- }],
- typeList: [{
- fullName: '审批前',
- id: 1
- }, {
- fullName: '审批后',
- id: 2
- }],
- options: [{
- fullName: '或签',
- id: 0
- }, {
- fullName: '会签',
- id: 1
- },
- {
- fullName: "依次审批",
- id: 2,
- }
- ],
- list: [{
- fullName: "重新审批",
- disabled: false,
- name: 1,
- },
- {
- fullName: "直接提交给我",
- disabled: false,
- name: 2,
- },
- ],
- props: {
- label: 'nodeName',
- value: 'nodeCode'
- },
- showCommonWords: false,
- dataForm: {
- auditRatio: 100,
- counterSign: 0,
- addSignType: 1,
- handleIds: '',
- handleVal: [],
- addSignUserIdList: '',
- fileList: [],
- handleOpinion: "",
- signImg: "",
- copyIds: "",
- branchList: [],
- candidateList: {},
- backNodeCode: "",
- backType: 1
- },
- config: {},
- show: false,
- selectVal: {},
- isCandidates: false,
- rules: {
- branchList: [{
- required: true,
- message: '请选择分支',
- type: 'array',
- trigger: 'blur,change'
- }],
- backNodeCode: [{
- required: true,
- message: '请选择退回节点',
- trigger: 'blur,change'
- }],
- signImg: [{
- required: true,
- message: '请签名',
- trigger: 'blur,change'
- }],
- addSignUserIdList: [{
- required: true,
- message: '请选择加签人员',
- type: 'array',
- trigger: 'blur,change'
- }],
- handleIds: [{
- required: true,
- message: '请选择人员',
- trigger: 'blur,change'
- }],
- handleVal: [{
- required: true,
- message: '请选择协办人员',
- trigger: 'blur,change',
- type: 'array'
- }],
- handleOpinion: [{
- required: true,
- message: '请输入意见',
- trigger: 'blur,change'
- }]
- },
- isCandidate: false,
- propertiesType: ''
- };
- },
- computed: {
- isBranch() {
- let show = false
- if (this.candidateType !== 3) show = true;
- this.branchList = this.config.branchList || [];
- if (!this.branchList.length) show = false;
- if (this.config.type === 'freeApprover' && this.dataForm.addSignType === 1) show = false;
- return show
- },
- showApproval() {
- return ['audit', 'reject', 'approvalButton'].includes(this.config.type)
- },
- showCustomCopy() {
- return this.config.isCustomCopy && ['audit', 'reject'].includes(this.config.type)
- },
- showCandidate() {
- return !['transfer', 'revoke', 'recall', 'back', 'assist'].includes(this.config.type) && this.isCandidate
- },
- showOpinion() {
- const list = ['transfer', 'assist', 'revoke', 'auditRecall', 'launchRecall', 'back', 'freeApprover']
- return list.includes(this.config.type)
- },
- opinionTitle() {
- const typeMap = {
- 'transfer': '转审原因',
- 'revoke': '撤销原因',
- 'assist': '协办原因',
- 'back': '退回意见',
- 'freeApprover': '加签意见',
- 'launchRecall': '撤回原因',
- 'auditRecall': '撤回原因',
- 'audit': '审批意见',
- 'reject': '审批意见'
- };
- const specialTypeMap = {
- 'transfer': {
- label: '转办原因'
- },
- 'audit': {
- label: '办理意见'
- }
- };
- const setFormRules = (rules) => {
- this.$nextTick(() => {
- this.$refs.dataForm.setRules(rules);
- });
- };
- const type = this.config.type;
- let resultLabel = typeMap[type] || '';
- if (specialTypeMap[type] && this.propertiesType === 'processing') resultLabel = specialTypeMap[type].label;
- return resultLabel;
- },
- fileLabel() {
- const type = this.config.type;
- const typeMap = {
- 'auditRecall': '撤回附件',
- 'freeApprover': '加签附件',
- 'back': '退回附件',
- 'transfer': '转审附件',
- 'audit': '审批附件',
- 'reject': '审批附件'
- };
- if (type === 'transfer' && this.propertiesType === 'processing') return '转办附件';
- if (type === 'audit' && this.propertiesType === 'processing') return '办理附件';
- const result = typeMap[type] || '';
- return result;
- },
- signRule() {
- return this.config.hasSign && (['audit', 'reject'].includes(this.config.type))
- }
- },
- onLoad(data) {
- try {
- this.config = JSON.parse(decodeURIComponent(data.config));
- } catch {
- this.config = JSON.parse(data.config);
- }
- uni.$on("confirm", (data, nodeCode) => {
- this.selectConfirm(data, nodeCode);
- });
- this.init()
- },
- onReady() {
- this.$refs.dataForm.setRules(this.rules);
- },
- methods: {
- init() {
- this.candidateType = this.config.candidateType; /* 1==分支 2==候选人 3==直接通过*/
- this.candidateList = this.config.candidateList || [];
- this.propertiesType = this.config?.propertiesType
- this.getSelector()
- this.handleLabel()
- this.config.candidateList.map(o => {
- this.isCandidates = o.isCandidates
- })
- this.copyIds = this.config?.circulateUser || ''
- this.dataForm.backNodeCode = this.config?.backNodeList?.length ? this.config.backNodeList[0].nodeCode : '';
- if (this.candidateType != 3) this.isCandidate = true;
- this.branchList = this.config.branchList || [];
- if (this.candidateType == 1) {
- let list = [];
- this.isCandidate = false;
- const defaultList = this.candidateList;
- for (let i = 0; i < this.dataForm.branchList.length; i++) {
- inner: for (let j = 0; j < this.branchList.length; j++) {
- let o = this.branchList[j];
- if (this.dataForm.branchList[i] === o.nodeCode && o.isCandidates) {
- this.isCandidate = true;
- list.push({
- ...o,
- label: o.nodeName + "审批人",
- });
- break inner;
- }
- }
- this.candidateList = [...defaultList, ...list];
- }
- }
- this.userInfo = uni.getStorageSync("userInfo") || {};
- this.dataForm.signImg = this.userInfo.signImg;
- if (this.config.type === 'freeApprover' && this.dataForm.addSignType == '1') this.isCandidates = false
- },
- handleLabel() {
- const config = this.config;
- const {
- type,
- propertiesType
- } = config;
- const typeMapping = {
- 'transfer': {
- title: propertiesType === 'processing' ? '转办' : '转审',
- label: '转审'
- },
- 'assist': {
- title: '协办',
- label: '协办'
- },
- 'revoke': {
- title: '撤销流程',
- label: '撤销'
- },
- 'launchRecall': {
- title: '撤回流程',
- label: '撤回'
- },
- 'reject': {
- title: '审批拒绝',
- label: '拒绝'
- },
- 'audit': (propertiesType) => ({
- title: propertiesType === 'processing' ? '办理' : '审批',
- label: '审批'
- }),
- 'auditRecall': {
- title: '撤回审核',
- label: '撤回'
- },
- 'freeApprover': {
- title: '加签',
- label: '加签'
- },
- 'back': {
- title: '退回',
- label: '退回'
- },
- 'submit': {
- title: '提交审核',
- label: '提交审核'
- }
- };
- const getTitleAndLabel = (typeKey, propertiesType) => {
- const mapping = typeMapping[typeKey];
- if (typeof mapping === 'function') return mapping(propertiesType);
- return mapping || {
- title: '',
- label: ''
- };
- };
- const {
- title,
- label
- } = getTitleAndLabel(type, propertiesType);
- this.title = title;
- this.label = label;
- uni.setNavigationBarTitle({
- title: this.title
- });
- },
- changeUserSelect(e) {
- this.dataForm.handleIds = e.join()
- },
- branchChange(e, list) {
- this.dataForm.branchList = e;
- this.candidateList = []
- this.init();
- },
- openSelect(item) {
- item.formData = this.config.formData;
- item.taskId = this.config.operatorId;
- item.selectList = item.selectList || [];
- item.candidateList = JSON.stringify(this.candidateList);
- item.delegateUser = this.config.delegateUser
- uni.navigateTo({
- url: "/pages/workFlow/candiDateUserSelect/index?data=" +
- encodeURIComponent(JSON.stringify(item)),
- });
- },
- selectConfirm(data, nodeCode) {
- let users = [];
- const item = this.candidateList.filter(o => o.nodeCode == nodeCode)[0] || {}
- item.value = data.map(o => o.id) || []
- item.fullName = (data.map(o => o.fullName) || []).join(',') || ''
- item.selectList = data || []
- for (let i = 0; i < this.candidateList.length; i++) {
- for (let j = 0; j < data.length; j++) {
- if (data[j].nodeCode === this.candidateList[i].nodeCode) {
- users.push(data[j].id);
- }
- }
- }
- this.$set(this.dataForm.candidateList, nodeCode, users);
- },
- getSelector() {
- getSelector().then(res => {
- this.commonList = res.data.list || []
- })
- },
- confirmCommonWord(e) {
- this.dataForm.handleOpinion = e.commonWordsText
- },
- handlePress(e) {
- this.$emit('handlePress')
- },
- addCommonWords() {
- let data = {
- commonWordsText: this.dataForm.handleOpinion,
- commonWordsType: 1
- }
- Create(data).then(res => {
- this.$u.toast(res.msg);
- })
- },
- freeApproverChange(e) {
- this.isCandidates = false;
- if (this.config.hasFreeApprover && e == 2 && this.candidateList.length) this.isCandidates = true;
- },
- confirm() {
- if (this.config.type === 'freeApprover') {
- this.dataForm.addSignParameter = {
- 'addSignUserIdList': this.dataForm.addSignUserIdList,
- 'auditRatio': this.dataForm.auditRatio,
- 'counterSign': this.dataForm.counterSign,
- 'addSignType': this.dataForm.addSignType
- }
- }
- if (!this.config.hasSign) delete this.dataForm.signImg
- this.dataForm.copyIds = Array.isArray(this.copyIds) && this.copyIds.length && this.copyIds.join()
- if (this.config.backType !== 3) this.dataForm.backType = this.config.backType
- let data = {
- ...this.dataForm,
- eventType: ['auditRecall', 'launchRecall'].includes(this.config.type) ? 'recall' : this.config
- .type,
- approvalField: this.config.approvalField
- }
- if (this.isCandidates || this.isCandidate) {
- let candidateList = {};
- for (let i = 0; i < this.candidateList.length; i++) {
- let item = this.candidateList[i]
- if (!item.selected && !item.value?.length) return this.$u.toast('候选人不能为空')
- candidateList[item.nodeCode] = item.value || [];
- }
- data.candidateList = candidateList;
- }
- this.$refs.dataForm.validate(valid => {
- if (valid) {
- uni.$emit('operate', data)
- setTimeout(() => {
- uni.navigateBack()
- }, 500)
- }
- });
- }
- }
- }
- </script>
- <style lang="scss">
- page {
- height: 100%;
- background-color: #fff !important;
- }
- ::v-deep .u-form-item--left {
- align-items: flex-start !important;
- }
- ::v-deep .u-form-item {
- line-height: 1.5rem !important;
- }
- .textarea {
- background-color: #f5f5f5;
- }
- ::v-deep .u-input--border {
- border: 1rpx solid #f5f5f5 !important;
- }
- .buttom-btn-left-inner {
- width: 50% !important;
- }
- .free-box {
- width: 100%;
- .free-box-txt {
- text-align: end;
- }
- }
- .flow-popup-content {
- padding-bottom: 88rpx;
- ::v-deep .u-form {
- .content {
- .u-form-item {
- .u-form-item__body {
- .u-form-item--left {
- // align-items: center !important;
- }
- }
- }
- }
- }
- .signature-box {
- border-top: none;
- }
- .content {
- padding: 0 20rpx;
- .back-item {
- .back-item-inner {
- justify-content: end;
- width: 100%;
- .selectNode {
- width: 100%;
- justify-content: flex-end;
- }
- }
- }
- .head-title {
- height: 80rpx;
- justify-content: space-between;
- color: #333333;
- }
- .uploadFile {
- width: 100%;
- padding-bottom: 8rpx;
- border-top: 1rpx solid #fbfbfc;
- }
- }
- }
- </style>
|