This commit is contained in:
Paidax
2025-06-04 15:27:27 +08:00
parent d046c3be5d
commit 2409b3ddfe
116 changed files with 12202 additions and 1804 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,28 @@
(function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;d<a.length&&0==a[d];)d++;this.num=Array(a.length-d+c);for(var b=0;b<a.length-d;b++)this.num[b]=a[b+d]}function p(a,c){this.totalCount=a;this.dataCount=c}function t(){this.buffer=[];this.length=0}u.prototype={getLength:function(){return this.data.length},
write:function(a){for(var c=0;c<this.data.length;c++)a.put(this.data.charCodeAt(c),8)}};o.prototype={addData:function(a){this.dataList.push(new u(a));this.dataCache=null},isDark:function(a,c){if(0>a||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e<c.length;e++)b+=c[e].dataCount;
for(e=0;e<this.dataList.length;e++)c=this.dataList[e],d.put(c.mode,4),d.put(c.getLength(),j.getLengthInBits(c.mode,a)),c.write(d);if(d.getLengthInBits()<=8*b)break}this.typeNumber=a}this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17;this.modules=Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=Array(this.moduleCount);for(var b=0;b<this.moduleCount;b++)this.modules[d][b]=null}this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-
7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(a,c);7<=this.typeNumber&&this.setupTypeNumber(a);null==this.dataCache&&(this.dataCache=o.createData(this.typeNumber,this.errorCorrectLevel,this.dataList));this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,c){for(var d=-1;7>=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]=
0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c<this.modules.length;c++)for(var d=1*c,b=0;b<this.modules[c].length;b++){var e=1*b;this.modules[c][b]&&(a.beginFill(0,100),a.moveTo(e,d),a.lineTo(e+1,d),a.lineTo(e+1,d+1),a.lineTo(e,d+1),a.endFill())}return a},
setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(a=8;a<this.moduleCount-8;a++)null==this.modules[6][a]&&(this.modules[6][a]=0==a%2)},setupPositionAdjustPattern:function(){for(var a=j.getPatternPosition(this.typeNumber),c=0;c<a.length;c++)for(var d=0;d<a.length;d++){var b=a[c],e=a[d];if(null==this.modules[b][e])for(var f=-2;2>=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c=
j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount-
b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0<i;i-=2)for(6==i&&i--;;){for(var g=0;2>g;g++)if(null==this.modules[b][i-g]){var n=!1;f<a.length&&(n=1==(a[f]>>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a,
c),b=new t,e=0;e<d.length;e++){var f=d[e];b.put(f.mode,4);b.put(f.getLength(),j.getLengthInBits(f.mode,a));f.write(b)}for(e=a=0;e<c.length;e++)a+=c[e].dataCount;if(b.getLengthInBits()>8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d=
0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g<c.length;g++){var n=c[g].dataCount,h=c[g].totalCount-n,b=Math.max(b,n),e=Math.max(e,h);f[g]=Array(n);for(var k=0;k<f[g].length;k++)f[g][k]=255&a.buffer[k+d];d+=n;k=j.getErrorCorrectPolynomial(h);n=(new q(f[g],k.getLength()-1)).mod(k);i[g]=Array(k.getLength()-1);for(k=0;k<i[g].length;k++)h=k+n.getLength()-i[g].length,i[g][k]=0<=h?n.get(h):0}for(k=g=0;k<c.length;k++)g+=c[k].totalCount;d=Array(g);for(k=n=0;k<b;k++)for(g=0;g<c.length;g++)k<f[g].length&&
(d[n++]=f[g][k]);for(k=0;k<e;k++)for(g=0;g<c.length;g++)k<i[g].length&&(d[n++]=i[g][k]);return d};s=4;for(var j={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,
78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var c=a<<10;0<=j.getBCHDigit(c)-j.getBCHDigit(j.G15);)c^=j.G15<<j.getBCHDigit(c)-j.getBCHDigit(j.G15);return(a<<10|c)^j.G15_MASK},getBCHTypeNumber:function(a){for(var c=a<<12;0<=j.getBCHDigit(c)-
j.getBCHDigit(j.G18);)c^=j.G18<<j.getBCHDigit(c)-j.getBCHDigit(j.G18);return a<<12|c},getBCHDigit:function(a){for(var c=0;0!=a;)c++,a>>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+
a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;d<a;d++)c=c.multiply(new q([1,l.gexp(d)],0));return c},getLengthInBits:function(a,c){if(1<=c&&10>c)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+
a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b<c;b++)for(var e=0;e<c;e++){for(var f=0,i=a.isDark(b,e),g=-1;1>=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5<f&&(d+=3+f-5)}for(b=0;b<c-1;b++)for(e=0;e<c-1;e++)if(f=0,a.isDark(b,e)&&f++,a.isDark(b+1,e)&&f++,a.isDark(b,e+1)&&f++,a.isDark(b+1,e+1)&&f++,0==f||4==f)d+=3;for(b=0;b<c;b++)for(e=0;e<c-6;e++)a.isDark(b,e)&&!a.isDark(b,e+1)&&a.isDark(b,e+
2)&&a.isDark(b,e+3)&&a.isDark(b,e+4)&&!a.isDark(b,e+5)&&a.isDark(b,e+6)&&(d+=40);for(e=0;e<c;e++)for(b=0;b<c-6;b++)a.isDark(b,e)&&!a.isDark(b+1,e)&&a.isDark(b+2,e)&&a.isDark(b+3,e)&&a.isDark(b+4,e)&&!a.isDark(b+5,e)&&a.isDark(b+6,e)&&(d+=40);for(e=f=0;e<c;e++)for(b=0;b<c;b++)a.isDark(b,e)&&f++;a=Math.abs(100*f/c/c-50)/5;return d+10*a}},l={glog:function(a){if(1>a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256),
LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<<m;for(m=8;256>m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d<this.getLength();d++)for(var b=0;b<a.getLength();b++)c[d+b]^=l.gexp(l.glog(this.get(d))+l.glog(a.get(b)));return new q(c,0)},mod:function(a){if(0>
this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b<this.getLength();b++)d[b]=this.get(b);for(b=0;b<a.getLength();b++)d[b]^=l.gexp(l.glog(a.get(b))+c);return(new q(d,0)).mod(a)}};p.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],
[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,
116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,
43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,
3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,
55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,
45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];p.getRSBlocks=function(a,c){var d=p.getRsBlockTable(a,c);if(void 0==d)throw Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+c);for(var b=d.length/3,e=[],f=0;f<b;f++)for(var h=d[3*f+0],g=d[3*f+1],j=d[3*f+2],l=0;l<h;l++)e.push(new p(g,j));return e};p.getRsBlockTable=function(a,c){switch(c){case 1:return p.RS_BLOCK_TABLE[4*(a-1)+0];case 0:return p.RS_BLOCK_TABLE[4*(a-1)+1];case 3:return p.RS_BLOCK_TABLE[4*
(a-1)+2];case 2:return p.RS_BLOCK_TABLE[4*(a-1)+3]}};t.prototype={get:function(a){return 1==(this.buffer[Math.floor(a/8)]>>>7-a%8&1)},put:function(a,c){for(var d=0;d<c;d++)this.putBit(1==(a>>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1,
correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f<a.getModuleCount();f++)for(var i=0;i<a.getModuleCount();i++){d.fillStyle=a.isDark(f,i)?h.foreground:h.background;var g=Math.ceil((i+1)*b)-Math.floor(i*b),
j=Math.ceil((f+1)*b)-Math.floor(f*b);d.fillRect(Math.round(i*b),Math.round(f*e),g,j)}}else{a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();c=r("<table></table>").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e<a.getModuleCount();e++){f=r("<tr></tr>").css("height",b+"px").appendTo(c);for(i=0;i<a.getModuleCount();i++)r("<td></td>").css("width",
d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,927 @@
/*
PinchZoom.js
Copyright (c) Manuel Stofer 2013 - today
Author: Manuel Stofer (mst@rtp.ch)
Version: 2.3.5
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
// polyfills
if (typeof Object.assign != 'function') {
// Must be writable: true, enumerable: false, configurable: true
Object.defineProperty(Object, "assign", {
value: function assign(target, varArgs) { // .length of function is 2
if (target == null) { // TypeError if undefined or null
throw new TypeError('Cannot convert undefined or null to object');
}
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource != null) { // Skip over if undefined or null
for (var nextKey in nextSource) {
// Avoid bugs when hasOwnProperty is shadowed
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
},
writable: true,
configurable: true
});
}
if (typeof Array.from != 'function') {
Array.from = function (object) {
return [].slice.call(object);
};
}
// utils
var buildElement = function(str) {
// empty string as title argument required by IE and Edge
var tmp = document.implementation.createHTMLDocument('');
tmp.body.innerHTML = str;
return Array.from(tmp.body.children)[0];
};
var triggerEvent = function(el, name) {
var event = document.createEvent('HTMLEvents');
event.initEvent(name, true, false);
el.dispatchEvent(event);
};
var definePinchZoom = function () {
/**
* Pinch zoom
* @param el
* @param options
* @constructor
*/
var PinchZoom = function (el, options) {
this.el = el;
this.zoomFactor = 1;
this.lastScale = 1;
this.offset = {
x: 0,
y: 0
};
this.initialOffset = {
x: 0,
y: 0,
};
this.options = Object.assign({}, this.defaults, options);
this.setupMarkup();
this.bindEvents();
this.update();
// The image may already be loaded when PinchZoom is initialized,
// and then the load event (which trigger update) will never fire.
if (this.isImageLoaded(this.el)) {
this.updateAspectRatio();
this.setupOffsets();
}
this.enable();
},
sum = function (a, b) {
return a + b;
},
isCloseTo = function (value, expected) {
return value > expected - 0.01 && value < expected + 0.01;
};
PinchZoom.prototype = {
defaults: {
tapZoomFactor: 2,
zoomOutFactor: 1.3,
animationDuration: 300,
maxZoom: 4,
minZoom: 0.5,
draggableUnzoomed: true,
lockDragAxis: false,
setOffsetsOnce: false,
use2d: true,
zoomStartEventName: 'pz_zoomstart',
zoomUpdateEventName: 'pz_zoomupdate',
zoomEndEventName: 'pz_zoomend',
dragStartEventName: 'pz_dragstart',
dragUpdateEventName: 'pz_dragupdate',
dragEndEventName: 'pz_dragend',
doubleTapEventName: 'pz_doubletap',
verticalPadding: 0,
horizontalPadding: 0,
onZoomStart: null,
onZoomEnd: null,
onZoomUpdate: null,
onDragStart: null,
onDragEnd: null,
onDragUpdate: null,
onDoubleTap: null
},
/**
* Event handler for 'dragstart'
* @param event
*/
handleDragStart: function (event) {
triggerEvent(this.el, this.options.dragStartEventName);
if(typeof this.options.onDragStart == "function"){
this.options.onDragStart(this, event)
}
this.stopAnimation();
this.lastDragPosition = false;
this.hasInteraction = true;
this.handleDrag(event);
},
/**
* Event handler for 'drag'
* @param event
*/
handleDrag: function (event) {
var touch = this.getTouches(event)[0];
this.drag(touch, this.lastDragPosition);
this.offset = this.sanitizeOffset(this.offset);
this.lastDragPosition = touch;
},
handleDragEnd: function () {
triggerEvent(this.el, this.options.dragEndEventName);
if(typeof this.options.onDragEnd == "function"){
this.options.onDragEnd(this, event)
}
this.end();
},
/**
* Event handler for 'zoomstart'
* @param event
*/
handleZoomStart: function (event) {
triggerEvent(this.el, this.options.zoomStartEventName);
if(typeof this.options.onZoomStart == "function"){
this.options.onZoomStart(this, event)
}
this.stopAnimation();
this.lastScale = 1;
this.nthZoom = 0;
this.lastZoomCenter = false;
this.hasInteraction = true;
},
/**
* Event handler for 'zoom'
* @param event
*/
handleZoom: function (event, newScale) {
// a relative scale factor is used
var touchCenter = this.getTouchCenter(this.getTouches(event)),
scale = newScale / this.lastScale;
this.lastScale = newScale;
// the first touch events are thrown away since they are not precise
this.nthZoom += 1;
if (this.nthZoom > 3) {
this.scale(scale, touchCenter);
this.drag(touchCenter, this.lastZoomCenter);
}
this.lastZoomCenter = touchCenter;
},
handleZoomEnd: function () {
triggerEvent(this.el, this.options.zoomEndEventName);
if(typeof this.options.onZoomEnd == "function"){
this.options.onZoomEnd(this, event)
}
this.end();
},
/**
* Event handler for 'doubletap'
* @param event
*/
handleDoubleTap: function (event) {
var center = this.getTouches(event)[0],
zoomFactor = this.zoomFactor > 1 ? 1 : this.options.tapZoomFactor,
startZoomFactor = this.zoomFactor,
updateProgress = (function (progress) {
this.scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center);
}).bind(this);
if (this.hasInteraction) {
return;
}
this.isDoubleTap = true;
if (startZoomFactor > zoomFactor) {
center = this.getCurrentZoomCenter();
}
this.animate(this.options.animationDuration, updateProgress, this.swing);
triggerEvent(this.el, this.options.doubleTapEventName);
if(typeof this.options.onDoubleTap == "function"){
this.options.onDoubleTap(this, event)
}
},
/**
* Compute the initial offset
*
* the element should be centered in the container upon initialization
*/
computeInitialOffset: function () {
this.initialOffset = {
x: -Math.abs(this.el.offsetWidth * this.getInitialZoomFactor() - this.container.offsetWidth) / 2,
y: -Math.abs(this.el.offsetHeight * this.getInitialZoomFactor() - this.container.offsetHeight) / 2,
};
},
/**
* Reset current image offset to that of the initial offset
*/
resetOffset: function() {
this.offset.x = this.initialOffset.x;
this.offset.y = this.initialOffset.y;
},
/**
* Determine if image is loaded
*/
isImageLoaded: function (el) {
if (el.nodeName === 'IMG') {
return el.complete && el.naturalHeight !== 0;
} else {
return Array.from(el.querySelectorAll('img')).every(this.isImageLoaded);
}
},
setupOffsets: function() {
if (this.options.setOffsetsOnce && this._isOffsetsSet) {
return;
}
this._isOffsetsSet = true;
this.computeInitialOffset();
this.resetOffset();
},
/**
* Max / min values for the offset
* @param offset
* @return {Object} the sanitized offset
*/
sanitizeOffset: function (offset) {
var elWidth = this.el.offsetWidth * this.getInitialZoomFactor() * this.zoomFactor;
var elHeight = this.el.offsetHeight * this.getInitialZoomFactor() * this.zoomFactor;
var maxX = elWidth - this.getContainerX() + this.options.horizontalPadding,
maxY = elHeight - this.getContainerY() + this.options.verticalPadding,
maxOffsetX = Math.max(maxX, 0),
maxOffsetY = Math.max(maxY, 0),
minOffsetX = Math.min(maxX, 0) - this.options.horizontalPadding,
minOffsetY = Math.min(maxY, 0) - this.options.verticalPadding;
return {
x: Math.min(Math.max(offset.x, minOffsetX), maxOffsetX),
y: Math.min(Math.max(offset.y, minOffsetY), maxOffsetY)
};
},
/**
* Scale to a specific zoom factor (not relative)
* @param zoomFactor
* @param center
*/
scaleTo: function (zoomFactor, center) {
this.scale(zoomFactor / this.zoomFactor, center);
},
/**
* Scales the element from specified center
* @param scale
* @param center
*/
scale: function (scale, center) {
scale = this.scaleZoomFactor(scale);
this.addOffset({
x: (scale - 1) * (center.x + this.offset.x),
y: (scale - 1) * (center.y + this.offset.y)
});
triggerEvent(this.el, this.options.zoomUpdateEventName);
if(typeof this.options.onZoomUpdate == "function"){
this.options.onZoomUpdate(this, event)
}
},
/**
* Scales the zoom factor relative to current state
* @param scale
* @return the actual scale (can differ because of max min zoom factor)
*/
scaleZoomFactor: function (scale) {
var originalZoomFactor = this.zoomFactor;
this.zoomFactor *= scale;
this.zoomFactor = Math.min(this.options.maxZoom, Math.max(this.zoomFactor, this.options.minZoom));
return this.zoomFactor / originalZoomFactor;
},
/**
* Determine if the image is in a draggable state
*
* When the image can be dragged, the drag event is acted upon and cancelled.
* When not draggable, the drag event bubbles through this component.
*
* @return {Boolean}
*/
canDrag: function () {
return this.options.draggableUnzoomed || !isCloseTo(this.zoomFactor, 1);
},
/**
* Drags the element
* @param center
* @param lastCenter
*/
drag: function (center, lastCenter) {
if (lastCenter) {
if(this.options.lockDragAxis) {
// lock scroll to position that was changed the most
if(Math.abs(center.x - lastCenter.x) > Math.abs(center.y - lastCenter.y)) {
this.addOffset({
x: -(center.x - lastCenter.x),
y: 0
});
}
else {
this.addOffset({
y: -(center.y - lastCenter.y),
x: 0
});
}
}
else {
this.addOffset({
y: -(center.y - lastCenter.y),
x: -(center.x - lastCenter.x)
});
}
triggerEvent(this.el, this.options.dragUpdateEventName);
if(typeof this.options.onDragUpdate == "function"){
this.options.onDragUpdate(this, event)
}
}
},
/**
* Calculates the touch center of multiple touches
* @param touches
* @return {Object}
*/
getTouchCenter: function (touches) {
return this.getVectorAvg(touches);
},
/**
* Calculates the average of multiple vectors (x, y values)
*/
getVectorAvg: function (vectors) {
return {
x: vectors.map(function (v) { return v.x; }).reduce(sum) / vectors.length,
y: vectors.map(function (v) { return v.y; }).reduce(sum) / vectors.length
};
},
/**
* Adds an offset
* @param offset the offset to add
* @return return true when the offset change was accepted
*/
addOffset: function (offset) {
this.offset = {
x: this.offset.x + offset.x,
y: this.offset.y + offset.y
};
},
sanitize: function () {
if (this.zoomFactor < this.options.zoomOutFactor) {
this.zoomOutAnimation();
} else if (this.isInsaneOffset(this.offset)) {
this.sanitizeOffsetAnimation();
}
},
/**
* Checks if the offset is ok with the current zoom factor
* @param offset
* @return {Boolean}
*/
isInsaneOffset: function (offset) {
var sanitizedOffset = this.sanitizeOffset(offset);
return sanitizedOffset.x !== offset.x ||
sanitizedOffset.y !== offset.y;
},
/**
* Creates an animation moving to a sane offset
*/
sanitizeOffsetAnimation: function () {
var targetOffset = this.sanitizeOffset(this.offset),
startOffset = {
x: this.offset.x,
y: this.offset.y
},
updateProgress = (function (progress) {
this.offset.x = startOffset.x + progress * (targetOffset.x - startOffset.x);
this.offset.y = startOffset.y + progress * (targetOffset.y - startOffset.y);
this.update();
}).bind(this);
this.animate(
this.options.animationDuration,
updateProgress,
this.swing
);
},
/**
* Zooms back to the original position,
* (no offset and zoom factor 1)
*/
zoomOutAnimation: function () {
if (this.zoomFactor === 1) {
return;
}
var startZoomFactor = this.zoomFactor,
zoomFactor = 1,
center = this.getCurrentZoomCenter(),
updateProgress = (function (progress) {
this.scaleTo(startZoomFactor + progress * (zoomFactor - startZoomFactor), center);
}).bind(this);
this.animate(
this.options.animationDuration,
updateProgress,
this.swing
);
},
/**
* Updates the container aspect ratio
*
* Any previous container height must be cleared before re-measuring the
* parent height, since it depends implicitly on the height of any of its children
*/
updateAspectRatio: function () {
this.unsetContainerY();
this.setContainerY(this.container.parentElement.offsetHeight);
},
/**
* Calculates the initial zoom factor (for the element to fit into the container)
* @return {number} the initial zoom factor
*/
getInitialZoomFactor: function () {
var xZoomFactor = this.container.offsetWidth / this.el.offsetWidth;
var yZoomFactor = this.container.offsetHeight / this.el.offsetHeight;
return Math.min(xZoomFactor, yZoomFactor);
},
/**
* Calculates the aspect ratio of the element
* @return the aspect ratio
*/
getAspectRatio: function () {
return this.el.offsetWidth / this.el.offsetHeight;
},
/**
* Calculates the virtual zoom center for the current offset and zoom factor
* (used for reverse zoom)
* @return {Object} the current zoom center
*/
getCurrentZoomCenter: function () {
var offsetLeft = this.offset.x - this.initialOffset.x;
var centerX = -1 * this.offset.x - offsetLeft / (1 / this.zoomFactor - 1);
var offsetTop = this.offset.y - this.initialOffset.y;
var centerY = -1 * this.offset.y - offsetTop / (1 / this.zoomFactor - 1);
return {
x: centerX,
y: centerY
};
},
/**
* Returns the touches of an event relative to the container offset
* @param event
* @return array touches
*/
getTouches: function (event) {
var rect = this.container.getBoundingClientRect();
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
var posTop = rect.top + scrollTop;
var posLeft = rect.left + scrollLeft;
return Array.prototype.slice.call(event.touches).map(function (touch) {
return {
x: touch.pageX - posLeft,
y: touch.pageY - posTop,
};
});
},
/**
* Animation loop
* does not support simultaneous animations
* @param duration
* @param framefn
* @param timefn
* @param callback
*/
animate: function (duration, framefn, timefn, callback) {
var startTime = new Date().getTime(),
renderFrame = (function () {
if (!this.inAnimation) { return; }
var frameTime = new Date().getTime() - startTime,
progress = frameTime / duration;
if (frameTime >= duration) {
framefn(1);
if (callback) {
callback();
}
this.update();
this.stopAnimation();
this.update();
} else {
if (timefn) {
progress = timefn(progress);
}
framefn(progress);
this.update();
requestAnimationFrame(renderFrame);
}
}).bind(this);
this.inAnimation = true;
requestAnimationFrame(renderFrame);
},
/**
* Stops the animation
*/
stopAnimation: function () {
this.inAnimation = false;
},
/**
* Swing timing function for animations
* @param p
* @return {Number}
*/
swing: function (p) {
return -Math.cos(p * Math.PI) / 2 + 0.5;
},
getContainerX: function () {
return this.container.offsetWidth;
},
getContainerY: function () {
return this.container.offsetHeight;
},
setContainerY: function (y) {
return this.container.style.height = y + 'px';
},
unsetContainerY: function () {
this.container.style.height = null;
},
/**
* Creates the expected html structure
*/
setupMarkup: function () {
this.container = buildElement('<div class="pinch-zoom-container"></div>');
this.el.parentNode.insertBefore(this.container, this.el);
this.container.appendChild(this.el);
this.container.style.overflow = 'hidden';
this.container.style.position = 'relative';
this.el.style.webkitTransformOrigin = '0% 0%';
this.el.style.mozTransformOrigin = '0% 0%';
this.el.style.msTransformOrigin = '0% 0%';
this.el.style.oTransformOrigin = '0% 0%';
this.el.style.transformOrigin = '0% 0%';
this.el.style.position = 'absolute';
},
end: function () {
this.hasInteraction = false;
this.sanitize();
this.update();
},
/**
* Binds all required event listeners
*/
bindEvents: function () {
var self = this;
detectGestures(this.container, this);
this.resizeHandler = this.update.bind(this)
window.addEventListener('resize', this.resizeHandler);
Array.from(this.el.querySelectorAll('img')).forEach(function(imgEl) {
imgEl.addEventListener('load', self.update.bind(self));
});
if (this.el.nodeName === 'IMG') {
this.el.addEventListener('load', this.update.bind(this));
}
},
/**
* Updates the css values according to the current zoom factor and offset
*/
update: function (event) {
if (event && event.type === 'resize') {
this.updateAspectRatio();
this.setupOffsets();
}
if (event && event.type === 'load') {
this.updateAspectRatio();
this.setupOffsets();
}
if (this.updatePlanned) {
return;
}
this.updatePlanned = true;
window.setTimeout((function () {
this.updatePlanned = false;
var zoomFactor = this.getInitialZoomFactor() * this.zoomFactor,
offsetX = -this.offset.x / zoomFactor,
offsetY = -this.offset.y / zoomFactor,
transform3d = 'scale3d(' + zoomFactor + ', ' + zoomFactor + ',1) ' +
'translate3d(' + offsetX + 'px,' + offsetY + 'px,0px)',
transform2d = 'scale(' + zoomFactor + ', ' + zoomFactor + ') ' +
'translate(' + offsetX + 'px,' + offsetY + 'px)',
removeClone = (function () {
if (this.clone) {
this.clone.parentNode.removeChild(this.clone);
delete this.clone;
}
}).bind(this);
// Scale 3d and translate3d are faster (at least on ios)
// but they also reduce the quality.
// PinchZoom uses the 3d transformations during interactions
// after interactions it falls back to 2d transformations
if (!this.options.use2d || this.hasInteraction || this.inAnimation) {
this.is3d = true;
removeClone();
this.el.style.webkitTransform = transform3d;
this.el.style.mozTransform = transform2d;
this.el.style.msTransform = transform2d;
this.el.style.oTransform = transform2d;
this.el.style.transform = transform3d;
} else {
// When changing from 3d to 2d transform webkit has some glitches.
// To avoid this, a copy of the 3d transformed element is displayed in the
// foreground while the element is converted from 3d to 2d transform
if (this.is3d) {
this.clone = this.el.cloneNode(true);
this.clone.style.pointerEvents = 'none';
this.container.appendChild(this.clone);
window.setTimeout(removeClone, 200);
}
this.el.style.webkitTransform = transform2d;
this.el.style.mozTransform = transform2d;
this.el.style.msTransform = transform2d;
this.el.style.oTransform = transform2d;
this.el.style.transform = transform2d;
this.is3d = false;
}
}).bind(this), 0);
},
/**
* Enables event handling for gestures
*/
enable: function() {
this.enabled = true;
},
/**
* Disables event handling for gestures
*/
disable: function() {
this.enabled = false;
},
/**
* Unmounts the zooming container and global event listeners
*/
destroy: function () {
window.removeEventListener('resize', this.resizeHandler);
if (this.container) {
this.container.remove();
this.container = null;
}
}
};
var detectGestures = function (el, target) {
var interaction = null,
fingers = 0,
lastTouchStart = null,
startTouches = null,
setInteraction = function (newInteraction, event) {
if (interaction !== newInteraction) {
if (interaction && !newInteraction) {
switch (interaction) {
case "zoom":
target.handleZoomEnd(event);
break;
case 'drag':
target.handleDragEnd(event);
break;
}
}
switch (newInteraction) {
case 'zoom':
target.handleZoomStart(event);
break;
case 'drag':
target.handleDragStart(event);
break;
}
}
interaction = newInteraction;
},
updateInteraction = function (event) {
if (fingers === 2) {
setInteraction('zoom');
} else if (fingers === 1 && target.canDrag()) {
setInteraction('drag', event);
} else {
setInteraction(null, event);
}
},
targetTouches = function (touches) {
return Array.from(touches).map(function (touch) {
return {
x: touch.pageX,
y: touch.pageY
};
});
},
getDistance = function (a, b) {
var x, y;
x = a.x - b.x;
y = a.y - b.y;
return Math.sqrt(x * x + y * y);
},
calculateScale = function (startTouches, endTouches) {
var startDistance = getDistance(startTouches[0], startTouches[1]),
endDistance = getDistance(endTouches[0], endTouches[1]);
return endDistance / startDistance;
},
cancelEvent = function (event) {
event.stopPropagation();
event.preventDefault();
},
detectDoubleTap = function (event) {
var time = (new Date()).getTime();
if (fingers > 1) {
lastTouchStart = null;
}
if (time - lastTouchStart < 300) {
cancelEvent(event);
target.handleDoubleTap(event);
switch (interaction) {
case "zoom":
target.handleZoomEnd(event);
break;
case 'drag':
target.handleDragEnd(event);
break;
}
} else {
target.isDoubleTap = false;
}
if (fingers === 1) {
lastTouchStart = time;
}
},
firstMove = true;
el.addEventListener('touchstart', function (event) {
if(target.enabled) {
firstMove = true;
fingers = event.touches.length;
detectDoubleTap(event);
}
}, { passive: false });
el.addEventListener('touchmove', function (event) {
if(target.enabled && !target.isDoubleTap) {
if (firstMove) {
updateInteraction(event);
if (interaction) {
cancelEvent(event);
}
startTouches = targetTouches(event.touches);
} else {
switch (interaction) {
case 'zoom':
if (startTouches.length == 2 && event.touches.length == 2) {
target.handleZoom(event, calculateScale(startTouches, targetTouches(event.touches)));
}
break;
case 'drag':
target.handleDrag(event);
break;
}
if (interaction) {
cancelEvent(event);
target.update();
}
}
firstMove = false;
}
}, { passive: false });
el.addEventListener('touchend', function (event) {
if(target.enabled) {
fingers = event.touches.length;
updateInteraction(event);
}
});
};
return PinchZoom;
};
var PinchZoom = definePinchZoom();
export default PinchZoom;
@@ -267,6 +267,15 @@
margin-bottom: 0;
}
.el-descriptions__table {
table-layout: fixed !important;
}
.el-descriptions-item__label {
text-align: center !important;
width: 14% !important;
}
.descriptions-form th.el-descriptions-item__label:has(+ td.el-descriptions-item__content > div.el-form-item.is-required):before {
content: "*";
color: #f56c6c;
@@ -11,6 +11,62 @@
const { $, BtnMenu, DropListMenu, PanelMenu, DropList, Panel, Tooltip } = wangEditor
class PDFMenu extends BtnMenu {
constructor(editor) {
const $elem = wangEditor.$(
`<div class="w-e-menu" data-title="上传pdf">
pdf
</div>`
)
super($elem, editor)
}
clickHandler() {
const _this = this
const inputFileElement = document.querySelector('#'+this.editor.textElemId).parentElement.parentElement.nextElementSibling
inputFileElement.click()
inputFileElement.addEventListener('change', function () {
const file = this.files[0];
const fileName = file.name
if (!fileName.toLowerCase().endsWith('.pdf')) {
alert('请上传pdf格式的文件')
_this.clearInputFile()
return
}
const formData = new FormData()
formData.append('file', file, file.name)
axios.post('/file_server/uploadFile', formData, {}).then(response => {
console.log(response.data)
if (response.data.code === 0) {
const html = `<a target="_blank" href="${FILE_STREAM_PREVIEW_ADDRESS}?id=${response.data.data.id}">
${response.data.data.filename}
</a>`
_this.editor.txt.html(html)
} else {
alert(response.data.msg + ',上传pdf失败,请联系管理员!')
_this.clearInputFile()
}
}).catch(error => {
console.log(error)
_this.clearInputFile()
alert('上传pdf失败,请联系管理员!')
});
});
}
clearInputFile() {
const obj = document.getElementById('fileInput');
obj.outerHTML = obj.outerHTML
}
tryChangeActive() {
this.active()
}
}
class AlertMenu extends BtnMenu {
constructor(editor) {
const $elem = wangEditor.$(
@@ -77,6 +133,7 @@ class AlertMenu extends BtnMenu {
}
wangEditor.registerMenu("alertMenuKey", AlertMenu)
wangEditor.registerMenu('pdfMenuKey', PDFMenu)
module.exports = {
name: "textEditor",
props: {
@@ -37,36 +37,43 @@
<el-descriptions-item label="线路名称">{{ viewData.lineName }}</el-descriptions-item>
<el-descriptions-item label="旅行社名称">{{ viewData.travelAgencyName }}</el-descriptions-item>
<el-descriptions-item label="是否携带家属">
<el-descriptions-item label="是否含随行人">
<span class="label label-primary">
{{ viewData.isFamily ? '携带' : '未携带' }}
{{ (viewData.companionList && viewData.companionList.length > 0) ? '携带' : '未携带' }}
</span>
</el-descriptions-item>
<el-descriptions-item label="床型">{{ viewData.bedInfo.bedType }}</el-descriptions-item>
<el-descriptions-item label="床位">{{
viewData.bedInfo.bedNum ? viewData.bedInfo.bedNum : '暂无'
}}
</el-descriptions-item>
<template v-if="modifyConfig.bedInfo && viewData.bedInfo">
<el-descriptions-item label="房间信息">
<span class="label label-primary">
{{ viewData.bedInfo.bedType }}
</span>
</el-descriptions-item>
<!-- <el-descriptions-item label="床位">{{
viewData.bedInfo.bedNum ? viewData.bedInfo.bedNum : '暂无'
}}
</el-descriptions-item>
<el-descriptions-item label="意向拼床人">
{{ viewData.bedInfo.otherSleepUser ? viewData.bedInfo.otherSleepUser : '暂无' }}
</el-descriptions-item>
<el-descriptions-item label="意向拼床人">
{{ viewData.bedInfo.otherSleepUser ? viewData.bedInfo.otherSleepUser : '暂无' }}
</el-descriptions-item>-->
</template>
</el-descriptions>
</div>
<div class="panel panel-default mt20" style="border: none">
<div v-if="modifyConfig.familyInfo == 2" class="panel panel-default mt20" style="border: none">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
同伴信息
随行人信息
</h3>
</div>
<div class="panel-body" style="border: 1px solid rgb(235, 238, 245)">
<el-table :data="viewData.companionList">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="身份证号" prop="idCard"></el-table-column>
<el-table-column label="年龄" prop="age"></el-table-column>
<el-table-column label="床型" prop="bedType">
<el-table-column label="年龄" prop="age"></el-table-column>
<el-table-column label="身份证号" prop="idCard"></el-table-column>
<el-table-column label="手机号" prop="mobile"></el-table-column>
<!-- <el-table-column label="床型" prop="bedType">
<template scope="{row}">
{{ row.bedInfo.bedType }}
</template>
@@ -80,13 +87,13 @@
<template scope="{row}">
{{ row.bedInfo.otherSleepUser ? row.bedInfo.otherSleepUser : '暂无' }}
</template>
</el-table-column>
</el-table-column>-->
<el-table-column label="关系" prop="relation"></el-table-column>
</el-table>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="所属分工会审核信息" name="2" v-if="viewData.selfUnionAuditId">
<el-tab-pane label="所属分工会审核信息" name="2" v-if="viewData.selfUnionAuditId && viewData.selfUnionAudit">
<div class="panel panel-default mt20" style="border: none">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
@@ -104,7 +111,7 @@
</el-descriptions>
</div>
</el-tab-pane>
<el-tab-pane label="意向线路分工会审核信息" name="3" v-if="viewData.joinLineUnionAuditId">
<el-tab-pane label="意向线路分工会审核信息" name="3" v-if="viewData.joinLineUnionAuditId && viewData.joinLineUnionAudit">
<div class="panel panel-default mt20" style="border: none">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
@@ -147,6 +154,7 @@ module.exports = {
bedInfo: {},
},
loading: false,
modifyConfig:{}
}
},
methods: {
@@ -169,9 +177,16 @@ module.exports = {
openAudit(id, activeName) {
this.findOne(id)
this.activeName = activeName
}
},
async getModifyConfig() {
const res = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne')
if (res.code === 0) {
this.modifyConfig = res.data
}
},
},
created() {
async created() {
await this.getModifyConfig();
}
}
</script>
@@ -42,19 +42,22 @@
{{ viewData.isFamily ? '携带' : '未携带' }}
</span>
</el-descriptions-item>
<el-descriptions-item label="床型">{{ viewData.bedInfo.bedType }}</el-descriptions-item>
<el-descriptions-item label="床位">{{
viewData.bedInfo.bedNum ? viewData.bedInfo.bedNum : '暂无'
}}
</el-descriptions-item>
<el-descriptions-item label="意向拼床人">
{{ viewData.bedInfo.otherSleepUser ? viewData.bedInfo.otherSleepUser : '暂无' }}
</el-descriptions-item>
<template v-if="modifyConfig.bedInfo">
<el-descriptions-item label="床型">{{ viewData.bedInfo.bedType }}</el-descriptions-item>
<el-descriptions-item label="床位">{{
viewData.bedInfo.bedNum ? viewData.bedInfo.bedNum : '暂无'
}}
</el-descriptions-item>
<el-descriptions-item label="意向拼床人">
{{ viewData.bedInfo.otherSleepUser ? viewData.bedInfo.otherSleepUser : '暂无' }}
</el-descriptions-item>
</template>
</el-descriptions>
</div>
<div class="panel panel-default mt20" style="border: none">
<div v-if="modifyConfig.familyInfo == 2" class="panel panel-default mt20" style="border: none">
<div class="panel-heading" style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none">
<h3 class="panel-title">
同伴信息
@@ -129,6 +132,7 @@ module.exports = {
bedInfo: {},
},
loading: false,
modifyConfig:{}
}
},
methods: {
@@ -149,9 +153,16 @@ module.exports = {
openAudit(id, activeName) {
this.findOne(id)
this.activeName = activeName
}
},
async getModifyConfig() {
const res = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne')
if (res.code === 0) {
this.modifyConfig = res.data
}
},
},
created() {
async created() {
await this.getModifyConfig();
}
}
</script>
@@ -11,7 +11,7 @@
<link rel="stylesheet" href="${base!}/assets/platform/plugins/element-ui/lib/theme-chalk/index.css">
<link rel="stylesheet" href="${base!}/assets/platform/fonts/themify-icons.css">
<link rel="stylesheet" href="${base!}/assets/platform/fonts/font-awesome.min.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/common.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/common.css?v=1.0.1">
<link rel="stylesheet" href="${base!}/assets/platform/css/main.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/elmain.css?v=1.0.0">
<link rel="stylesheet" href="${base!}/assets/platform/css/panel.css">
@@ -11,7 +11,7 @@
<link rel="stylesheet" href="${base!}/assets/platform/plugins/element-ui/lib/theme-chalk/index.css">
<link rel="stylesheet" href="${base!}/assets/platform/fonts/themify-icons.css">
<link rel="stylesheet" href="${base!}/assets/platform/fonts/font-awesome.min.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/common.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/common.css?v=1.0.0">
<link rel="stylesheet" href="${base!}/assets/platform/css/main.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/elmain.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/panel.css">
@@ -236,6 +236,7 @@ layout("/mobile/platform.html"){
this.id = item.id
this.formData.username = this.user.username
this.formData.auditTime = moment().format('YYYY-MM-DD')
this.formData.unionName = null
this.infoShow = true
this.showApprovalForm = true
this.$nextTick(() => {
@@ -257,17 +257,28 @@ layout("/mobile/platform.html"){
confirmButtonText: "确定",
cancelButtonText: "取消"
}).then(async () => {
const formData = this.formData
if (this.formData.families) {
formData.families = JSON.stringify(this.formData.families)
const formData = JSON.parse(JSON.stringify(this.formData))
if (formData.families) {
formData.families = JSON.stringify(formData.families)
}
const resp = await $.post('/platform/member/apply/submit/doSave', formData)
if (resp.code === 0) {
this.$toast.success('操作成功')
this.user.member = true
pjaxReplace('/platform/member/apply/mine/h5')
vant.Dialog.alert({
title: '温馨提示',
message: '您已成功【保存】申请,请耐心等待相关负责人审核',
}).then(() => {
this.user.member = true
pjaxReplace('/platform/member/apply/mine/h5')
});
// this.$toast.success('操作成功')
// this.user.member = true
// pjaxReplace('/platform/member/apply/mine/h5')
} else {
this.$toast.fail(resp.msg)
vant.Dialog.alert({
title: '温馨提示',
message: resp.msg,
})
// this.$toast.fail(resp.msg)
}
})
},
@@ -288,17 +299,24 @@ layout("/mobile/platform.html"){
confirmButtonText: "确定",
cancelButtonText: "取消"
}).then(async () => {
const formData = this.formData
if (this.formData.families) {
formData.families = JSON.stringify(this.formData.families)
const formData = JSON.parse(JSON.stringify(this.formData))
if (formData.families) {
formData.families = JSON.stringify(formData.families)
}
const resp = await $.post('/platform/member/apply/submit/doSubmit', formData)
if (resp.code === 0) {
this.$toast.success('操作成功')
this.user.member = true
pjaxReplace('/platform/member/apply/mine/h5')
vant.Dialog.alert({
title: '温馨提示',
message: '您已成功【提交】申请,请耐心等待相关负责人审核',
}).then(() => {
this.user.member = true
pjaxReplace('/platform/member/apply/mine/h5')
});
} else {
this.$toast.fail(resp.msg)
vant.Dialog.alert({
title: '温馨提示',
message: resp.msg,
})
}
})
},
@@ -13,6 +13,9 @@
<link rel="stylesheet" href="${base!}/assets/mobile/css/theme.css">
<link rel="stylesheet" href="${base!}/assets/mobile/css/main.css">
<link rel="stylesheet" href="${base!}/assets/mobile/css/pdfh5.css">
<link rel="stylesheet" href="${base!}/assets/platform/plugins/vant/vant.css?v=1.0.1">
<script>
@@ -56,6 +59,11 @@
<script type="text/javascript"
src="https://webapi.amap.com/maps?v=2.0&key=57f0d098ba1b881ecc436c4cfd23bbbf&plugin=AMap.PolyEditor,AMap.Geolocation"></script>
<!-- pdf -->
<script src="${base!}/assets/mobile/js/pdf/pdf.js" type="text/javascript" charset="utf-8"></script>
<script src="${base!}/assets/mobile/js/pdf/pdf.worker.js" type="text/javascript" charset="utf-8"></script>
<script src="${base!}/assets/mobile/js/pdf/pdfh5.js" type="text/javascript" charset="utf-8"></script>
<!--字典混入-->
<script src="${base!}/components/plugins/sysDict/DictData.js"></script>
@@ -370,7 +370,6 @@ layout("/mobile/platform.html"){
}
} else if (v.itx === 2) {
if (v.rval) {
debugger
formData.push({
"rwid": v.wors[0].wid,
"rval": v.rval,
@@ -17,7 +17,9 @@ layout("/mobile/platform.html"){
.content {
line-height: 26px;
padding: 0px 20px 56px 20px;
padding: 0 20px 56px 20px;
max-height: calc(100vh - 46px - 210px - 60px - 24px);
overflow-y: auto;
}
.title {
@@ -159,9 +161,9 @@ layout("/mobile/platform.html"){
color: grey;
}
.header div span {
color: grey;
}
/*.header div span {*/
/* color: grey;*/
/*}*/
.header :last-child {
font-size: 14px;
@@ -195,6 +197,11 @@ layout("/mobile/platform.html"){
background-color: white;
}
.pdf_div {
padding-bottom: 70px;
height: calc(100vh - 46px - 170px - 60px - 24px);
}
</style>
<div id="app" v-cloak>
@@ -235,8 +242,11 @@ layout("/mobile/platform.html"){
</div>
</div>
<van-divider></van-divider>
<div v-if="baseData.content" v-html="baseData.content" class="content"></div>
<div v-else v-html="configData.notice" class="content"></div>
<!-- <div v-if="baseData.content" v-html="baseData.content" class="content"></div>-->
<!-- <div v-else v-html="configData.notice" class="content"></div>-->
<van-divider :style="{ color: 'orange', fontSize: '12px' }">上下滑动翻页,单击查看图片,再单击返回</van-divider>
<div v-if="isPdf" v-html="baseData.content" class="content"></div>
<div v-else id="demo" class="pdf_div"></div>
<!--<van-empty
v-else class="custom-image"
image="https://img01.yzcdn.cn/vant/custom-empty-image.png"
@@ -254,11 +264,13 @@ layout("/mobile/platform.html"){
<div class="footer" v-if="fromUrlByMy != 'edit'">
<template v-if="baseData.isNormal==0&&baseData.isNormalFalse>0">
<van-button @click="join"
class="join">我要报名
class="join">
{{ (fromUrlByMy == 'editDo') ? '修改报名' : '我要报名' }}
</van-button>
</template>
<template v-else>
<van-button v-if="moment().unix() <= moment(baseData.signUpEndTime).unix()" @click="join" class="join">我要报名
<van-button v-if="moment().unix() <= moment(baseData.signUpEndTime).unix()" @click="join" class="join">
{{ (fromUrlByMy == 'editDo') ? '修改报名' : '我要报名' }}
</van-button>
<van-button v-if="moment().unix() > moment(baseData.signUpEndTime).unix()" class="join">报名结束</van-button>
</template>
@@ -280,8 +292,8 @@ layout("/mobile/platform.html"){
<div class="van-card-body">
<van-field label="姓名" readonly v-model="formData.userName"></van-field>
<van-field label="工号" readonly v-model="formData.loginName"></van-field>
<van-field label="身份证" name="idCard" :rules="[{ required: true }]"
placeholder="请填写身份证号" v-model="formData.idCard"></van-field>
<van-field label="身份证" name="idCard" :rules="[{ required: true }]"
placeholder="请填写身份证号、护照、台胞证等" v-model="formData.idCard"></van-field>
<van-field label="手机号" name="mobile" :rules="[{ required: true }]"
placeholder="请填写手机号" v-model="formData.mobile"></van-field>
<van-field label="所属工会" readonly v-model="formData.unionName"></van-field>
@@ -293,13 +305,24 @@ layout("/mobile/platform.html"){
<div class="van-doc-card" style="margin-bottom: 16px">
<div></div>
<div class="van-card-header">
床位信息
房间信息
</div>
<div class="van-card-body">
<van-field @click="self = true; roomVisible = true" readonly is-link label="房" name="bedType"
<van-field :rules="[{ required: true, message: '请选择是否包房' }]" label="是否包房" name="bedType">
<template #input>
<van-radio-group direction="horizontal" v-model="formData.bedInfo.bedType">
<van-radio name="包房" shape="square">包房</van-radio>
<van-radio name="不包房" shape="square">不包房</van-radio>
</van-radio-group>
</template>
</van-field>
<div>
<span style="color: red;margin-left: 14px;font-size: 14px">包房需自费;不包房两位老师一间且随机分配</span>
</div>
<!--<van-field @click="self = true; roomVisible = true" readonly is-link label="房间" name="bedType"
placeholder="请选择房间" v-model="formData.bedInfo.bedType"
:rules="[{ required: true }]"></van-field>
<van-field v-if="formData.bedInfo.bedType == '标准间'" @click="self = true; bedVisible = true"
:rules="[{ required: true }]"></van-field>-->
<!--<van-field v-if="formData.bedInfo.bedType == '标准间'" @click="self = true; bedVisible = true"
readonly is-link label="床位"
name="bedNum" placeholder="请选择床位" v-model="formData.bedInfo.bedNum"
:rules="[{ required: true }]"></van-field>
@@ -315,12 +338,12 @@ layout("/mobile/platform.html"){
<van-field v-if="formData.bedInfo.bedType == '标准间' && formData.bedInfo.isSleepTogether == true"
label="意向拼房人" name="otherSleepUser" placeholder="多个拼房人请用,隔开"
v-model="formData.bedInfo.otherSleepUser"
:rules="[{ required: true }]"></van-field>
:rules="[{ required: true }]"></van-field>-->
</div>
</div>
<!--随行人信息-->
<div class="van-doc-card" style="margin-bottom: 16px">
<div v-if="index != 2" class="van-doc-card" style="margin-bottom: 16px">
<div></div>
<div class="van-card-header"
style="display: flex; justify-content: space-between; align-items: center">
@@ -330,62 +353,73 @@ layout("/mobile/platform.html"){
<van-tag @click="addCompanion" size="large" type="primary" color="#1867b0">添加随行人</van-tag>
</div>
</div>
<div v-if="formData.companionList.length > 0" class="van-card-body">
<van-tabs v-model="active" type="card" color="#0e78c5" animated>
<van-tab v-for="item, index in formData.companionList" :title="'随行人' + (index + 1)">
<van-field label="姓名" name="userName" placeholder="请填写姓名" v-model="item.userName"
:rules="[{ required: true }]"></van-field>
<!--<van-field label="工号" name="loginName" placeholder="若没有工号,请忽略此项" v-model="item.loginName"></van-field>-->
<van-field label="年龄" name="age" placeholder="请填写年龄" v-model="item.age"
type="digit" :rules="[{ required: true }]"></van-field>
<van-field :rules="[{ required: true, message: '请选择性别' }]" label="性别" name="validator">
<template #input>
<van-radio-group direction="horizontal" v-model="item.sex">
<van-radio name="男" shape="square"></van-radio>
<van-radio name="女" shape="square"></van-radio>
</van-radio-group>
</template>
</van-field>
<van-field label="身份证号" name="idCard" placeholder="请填写身份证号"
:rules="[{ required: true }]" type="digit"
v-model="item.idCard"></van-field>
<van-field label="手机号" name="mobile" placeholder="请填写手机号"
:rules="[{ required: true }]" type="digit"
v-model="item.mobile"></van-field>
<van-field @click="companionVisible = true" readonly is-link label="与本人关系"
name="relation"
placeholder="随行人与本人关系" v-model="item.relation"
:rules="[{ required: true }]"></van-field>
<van-field @click="self = false; roomVisible = true" readonly is-link label="房间"
name="bedType" placeholder="请选择房间"
v-model="item.bedInfo.bedType"></van-field>
<div style="font-size: 8px; color:orangered; padding-left: 16px; padding-bottom: 4px">
提醒:如果跟报名人员同一房间,无须选择!
</div>
<van-field v-if="item.bedInfo.bedType == '标准间'" @click="self = false; bedVisible = true"
readonly is-link label="床位"
name="bedNum" placeholder="请选择床位" v-model="item.bedInfo.bedNum"></van-field>
<van-field v-if="item.bedInfo.bedType == '标准间'"
:rules="[{ validator, message: '请选择是否拼房' }]" label="是否拼房">
<template #input>
<van-radio-group direction="horizontal" v-model="item.bedInfo.isSleepTogether">
<van-radio :name="true" shape="square"></van-radio>
<van-radio :name="false" shape="square"></van-radio>
</van-radio-group>
</template>
</van-field>
<van-field v-if="item.bedInfo.bedType == '标准间' && item.bedInfo.isSleepTogether == true"
label="意向拼房人" name="otherSleepUser" placeholder="多个拼房人请用,隔开"
v-model="item.bedInfo.otherSleepUser"></van-field>
</van-tab>
</van-tabs>
</div>
<div v-if="formData.companionList.length == 0" class="companionList_empty_text">
<template v-if="configData.familyInfo === 2">
<div>
<span style="color: red;margin-left: 20px;font-size: 14px">限填写3岁以上70岁以下随行人</span>
</div>
<div v-if="formData.companionList.length > 0" class="van-card-body">
<van-tabs v-model="active" type="card" color="#0e78c5" animated>
<van-tab v-for="item, index in formData.companionList" :title="'随行人' + (index + 1)">
<van-field label="姓名" name="userName" placeholder="请填写姓名" v-model="item.userName"
:rules="[{ required: true }]"></van-field>
<!--<van-field label="工号" name="loginName" placeholder="若没有工号,请忽略此项" v-model="item.loginName"></van-field>-->
<van-field label="年龄" name="age" placeholder="请填写年龄" v-model="item.age"
type="digit" :rules="[{ required: true }]"></van-field>
<van-field :rules="[{ required: true, message: '请选择性别' }]" label="性别" name="validator">
<template #input>
<van-radio-group direction="horizontal" v-model="item.sex">
<van-radio name="男" shape="square"></van-radio>
<van-radio name="女" shape="square"></van-radio>
</van-radio-group>
</template>
</van-field>
<van-field label="身份证件" name="idCard" placeholder="请填写身份证号"
:rules="[{ required: true }]" maxlength="18"
@input="getAgeAndSex(item)" v-model="item.idCard"></van-field>
<van-field label="手机号" name="mobile" placeholder="请填写手机号"
:rules="[{ required: true }]" type="digit"
v-model="item.mobile"></van-field>
<van-field @click="companionVisible = true" readonly is-link label="与本人关系"
name="relation"
placeholder="随行人与本人关系" v-model="item.relation"
:rules="[{ required: true }]"></van-field>
<!--<van-field @click="self = false; roomVisible = true" readonly is-link label="房间"
name="bedType" placeholder="请选择房间"
v-model="item.bedInfo.bedType"></van-field>
<div style="font-size: 8px; color:orangered; padding-left: 16px; padding-bottom: 4px">
提醒:如果跟报名人员同一房间,无须选择!
</div>
<van-field v-if="item.bedInfo.bedType == '标准间'" @click="self = false; bedVisible = true"
readonly is-link label="床位"
name="bedNum" placeholder="请选择床位" v-model="item.bedInfo.bedNum"></van-field>
<van-field v-if="item.bedInfo.bedType == '标准间'"
:rules="[{ validator, message: '请选择是否拼房' }]" label="是否拼房">
<template #input>
<van-radio-group direction="horizontal" v-model="item.bedInfo.isSleepTogether">
<van-radio :name="true" shape="square">是</van-radio>
<van-radio :name="false" shape="square">否</van-radio>
</van-radio-group>
</template>
</van-field>
<van-field v-if="item.bedInfo.bedType == '标准间' && item.bedInfo.isSleepTogether == true"
label="意向拼房人" name="otherSleepUser" placeholder="多个拼房人请用,隔开"
v-model="item.bedInfo.otherSleepUser"></van-field>-->
</van-tab>
</van-tabs>
</div>
<div v-if="formData.companionList.length == 0" class="companionList_empty_text">
<span>
如有随行人出行,请添加随行人
</span>
</div>
</div>
</template>
<template v-else>
<van-field label="家属数量" name="familyNumber" placeholder="请填写家属数量" v-model="formData.familyNumber"
type="digit" :rules="[{ required: true }]"></van-field>
</template>
</div>
<div class="submitButton">
@@ -401,7 +435,7 @@ layout("/mobile/platform.html"){
<!--房间类型弹出框-->
<van-popup position="bottom" round v-model="roomVisible">
<van-picker
title="入住房间" show-toolbar
title="房间信息" show-toolbar
:columns="roomColumns"
@confirm="roomConfirm"
@cancel="roomCancel">
@@ -436,16 +470,17 @@ layout("/mobile/platform.html"){
if (r != null) return decodeURI(r[2]);
return null;
}
let pdfh5 = null
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
isPdf: false,
active: 0,
roomColumns: ['大床房', '标准间'],
roomColumns: ['房', '默认房间'],
bedColumns: ['1', '2'],
companionColumns: ['亲属', '朋友'],
companionColumns: ['配偶', '子女', '亲属', '其他'],
bedVisible: false,
roomVisible: false,
companionVisible: false,
@@ -475,6 +510,18 @@ layout("/mobile/platform.html"){
}
},
methods: {
getAgeAndSex(item){
try {
const value = item.idCard
const age = this.calculateAgeFromIdCard(value)
this.$set(item, "age", age)
const sex = this.getGenderFromIdCard(value)
this.$set(item, "sex", sex)
} catch (error) {
console.log(error)
}
},
roomCancel() {
if (!this.self) {
this.formData.companionList[this.active].bedInfo.bedType = ''
@@ -501,18 +548,43 @@ layout("/mobile/platform.html"){
return value != null
},
async joinSubmit() {
const toast = vant.Toast.loading({
duration: 0,
forbidClick: true,
overlay: true,
message: '努力提交中',
})
const cloneData = clone(this.formData)
cloneData.companionList.forEach((item, index) => {
if (item.userName === '') {
cloneData.companionList.splice(index, 1)
}
})
if (cloneData.companionList) {
for (let i = 0; i < cloneData.companionList.length; i++) {
const companion = cloneData.companionList[i];
// 检查每个字段是否为空
if (!companion.userName || !companion.idCard || !companion.mobile || !companion.relation) {
this.$toast('请填写完整随行人信息')
return
}
// 填了身份证,校验是否正确
if (companion.idCard) {
if (!this.validateIdCard(companion.idCard)) {
this.$toast('随行人'+ (i+1) +'的身份证不正确')
return
} else {
// 判断companion.age,是不是在3到70岁之间,不是就提示
if (companion.age < 3 || companion.age > 70) {
this.$toast('随行人'+ (i+1) +'的年龄超出限制,请天添加其他联系人')
return
}
}
}
}
}
const toast = vant.Toast.loading({
duration: 0,
forbidClick: true,
overlay: true,
message: '努力提交中',
})
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/doSignUpForBaseManagement', {
enroll: JSON.stringify(cloneData),
})
@@ -547,7 +619,10 @@ layout("/mobile/platform.html"){
}),
})
if (re.code !== 0) {
vant.Toast(re.msg)
vant.Dialog.alert({
title: '温馨提示',
message: re.msg,
})
return
}
if (this.fromUrlByMy !== 'editDo') {
@@ -615,6 +690,105 @@ layout("/mobile/platform.html"){
const resp = await $.get('/platform/theRapyRecuperation/TheRapyConfig/findOne')
this.configData = resp.data
},
calculateAgeFromIdCard(idCard) {
// 检查身份证号码是否合法
if (!idCard) {
throw new Error("Invalid ID card format")
}
let birthDateStr
let birthYear, birthMonth, birthDay
// 处理18位身份证号码
if (idCard.length === 18) {
birthDateStr = idCard.substring(6, 14)
birthYear = parseInt(birthDateStr.substring(0, 4), 10)
birthMonth = parseInt(birthDateStr.substring(4, 6), 10) - 1 // 月份从0开始
birthDay = parseInt(birthDateStr.substring(6, 8), 10)
}
// 处理15位身份证号码
else if (idCard.length === 15) {
birthDateStr = idCard.substring(6, 12)
birthYear = parseInt("19" + birthDateStr.substring(0, 2), 10) // 使用字符串拼接
birthMonth = parseInt(birthDateStr.substring(2, 4), 10) - 1 // 月份从0开始
birthDay = parseInt(birthDateStr.substring(4, 6), 10)
} else {
throw new Error("Invalid ID card format. Only 15 or 18 digits are supported.")
}
// 获取当前日期
const currentDate = new Date()
// 计算年龄
let age = currentDate.getFullYear() - birthYear
// 如果当前日期还没过生日,则年龄减1
if (currentDate.getMonth() < birthMonth || (currentDate.getMonth() === birthMonth && currentDate.getDate() < birthDay)) {
age -= 1
}
return age
},
getGenderFromIdCard(idCard) {
// 检查身份证号码是否合法
if (!idCard) {
throw new Error("Invalid ID card format")
}
let genderDigit
// 处理18位身份证号码
if (idCard.length === 18) {
genderDigit = parseInt(idCard.charAt(16), 10) // 第17位
}
// 处理15位身份证号码
else if (idCard.length === 15) {
genderDigit = parseInt(idCard.charAt(14), 10) // 第15位
} else {
throw new Error("Invalid ID card format. Only 15 or 18 digits are supported.")
}
// 判断性别
if (genderDigit % 2 === 0) {
return "女"
} else {
return "男"
}
},
validateIdCard(idCard) {
if (!idCard) {
return false
}
// 18位身份证号码校验
if (idCard.length === 18) {
const idCardRegex = /^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}(\d|[Xx])$/
if (!idCardRegex.test(idCard)) {
return false
}
// 校验码计算
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
const checksums = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
let sum = 0
for (let i = 0; i < 17; i++) {
sum += idCard[i] * weights[i]
}
const checksum = checksums[sum % 11]
return checksum === idCard[17].toUpperCase()
}
// 15位身份证号码校验
else if (idCard.length === 15) {
const idCardRegex = /^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/
return idCardRegex.test(idCard)
}
// 外国人或其他情况
else {
return false
}
},
},
async created() {
this.id = getQueryString('id') ? getQueryString('id') : ''
@@ -626,7 +800,58 @@ layout("/mobile/platform.html"){
if (this.enrollId) {
await this.findSignUpInfoById()
}
this.getData()
await this.getData()
try {
const parser = new DOMParser();
const doc = parser.parseFromString(this.baseData.content, 'text/html');
console.log(this.baseData)
const link = doc.querySelector('a');
const href = link.getAttribute('href');
this.$nextTick(() => {
pdfh5 = new Pdfh5('#demo', {
pdfurl: href,
});
})
}catch (e) {
this.isPdf = true
document.addEventListener('click', function (event) {
// 打印被点击的元素标签名和 class
if (event.target.tagName === 'IMG' && event.target.className !== 'top_icon') {
vant.ImagePreview({
images: [event.target.src],
closeable: true,
})
}
})
}
this.$nextTick(() => {
pdfh5.on("complete", function () {
const imgDoc = document.querySelectorAll('img')
let array = []
let classArray = []
imgDoc.forEach(o => {
if(o.getAttribute('class') !== 'top_icon') {
classArray.push(o.getAttribute('class'))
array.push(o.getAttribute('src'))
}
})
document.addEventListener('click', function (event) {
// 打印被点击的元素标签名和 class
if (event.target.tagName === 'IMG' && event.target.className !== 'top_icon') {
const index = classArray.indexOf(event.target.className)
if(index !== -1) {
vant.ImagePreview({
images: array,
startPosition: index,
closeable: true,
})
}
}
})
})
})
},
mounted() {
window.addEventListener('scroll', this.scrollToTop)
@@ -29,23 +29,28 @@ layout("/mobile/platform.html"){
.pre_text {
white-space: break-spaces;
padding-left: 7px;
max-height: calc(80vh - 290px);
overflow-y: auto;
}
.pdfjs {
height: 90%;
}
</style>
<div id="app" v-cloak>
<van-sticky>
<van-nav-bar @click-left="history.back()" fixed left-arrow placeholder title="职工疗休养"></van-nav-bar>
<van-nav-bar @click-left="pjaxReplace('/mobile/index')" fixed left-arrow placeholder title="职工疗休养"></van-nav-bar>
</van-sticky>
<!--顶部轮播图-->
<van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">
<van-swipe class="my-swipe" style="height: 20vh" :autoplay="3000" indicator-color="white">
<van-swipe-item>
<van-image width="100%" height="180" src="/assets/mobile/img/therapyRecuperation/index1.jpg"></van-image>
<van-image width="100%" height="180" src="/assets/mobile/img/therapyRecuperation/index1.jpeg"></van-image>
</van-swipe-item>
<van-swipe-item>
<van-image height="180" src="/assets/mobile/img/therapyRecuperation/index2.jpg"></van-image>
<van-image height="180" src="/assets/mobile/img/therapyRecuperation/index1.jpeg"></van-image>
</van-swipe-item>
</van-swipe>
@@ -60,35 +65,36 @@ layout("/mobile/platform.html"){
</div>
<!--疗休养描述-->
<div class="van-doc-card" style="margin-top: 20px;margin-bottom: 60px">
<div class="van-doc-card" style="margin-top: 10px; height: calc(80vh - 245px)">
<van-image width="190" height="43" src="/assets/mobile/img/therapyRecuperation/title.png"></van-image>
<div class="pre_text" v-html="configData.notice"></div>
<div v-if="isPdf" class="pre_text" v-html="configData.notice"></div>
<div v-else id="demo" class="pdf_div"></div>
</div>
<div>
<van-tabbar v-model="tarBarActive">
<van-tabbar-item icon="home-o" replace url="/platform/mobile/theRapyRecuperation/index">疗休养报名
</van-tabbar-item>
<van-tabbar-item icon="manager-o" replace url="/platform/mobile/theRapyRecuperation/myRecuperation">我的疗休养
</van-tabbar-item>
<van-tabbar-item icon="home-o" replace url="/platform/mobile/theRapyRecuperation/index">疗休养首页</van-tabbar-item>
<van-tabbar-item icon="search" replace url="/platform/mobile/theRapyRecuperation/mobileLineListPage">线路选择</van-tabbar-item>
<van-tabbar-item icon="manager-o" replace url="/platform/mobile/theRapyRecuperation/myRecuperation">我的报名</van-tabbar-item>
</van-tabbar>
</div>
</div>
<script>
let pdfh5 = null
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
tarBarActive: 0,
chooseButton: [],
configData: {},
tarBarActive: 0,
isPdf: false,
}
},
methods: {
async toLineList(index) {
const isExist = await getScopeUser(this.configData.activityGroupId)
/*const isExist = await getScopeUser(this.configData.activityGroupId)
if (!isExist) {
vant.Dialog.alert({
title: '温馨提示',
@@ -96,7 +102,7 @@ layout("/mobile/platform.html"){
confirmButtonColor: '#1867b0'
})
return
}
}*/
localStorage.setItem("clickIndex", JSON.stringify({clickIndex: index}))
location.href = '/platform/mobile/theRapyRecuperation/mobileLineListPage'
},
@@ -107,8 +113,58 @@ layout("/mobile/platform.html"){
},
async created() {
this.chooseButton = await getEnumOptions('TheRapyRecuperationType')
this.chooseButton = this.chooseButton.filter(o => o.value !== 2 && o.value !== 3)
this.chooseButton = this.chooseButton.filter(o => o.value !== 2)
await this.getConfigData()
try {
const parser = new DOMParser();
const doc = parser.parseFromString(this.configData.notice, 'text/html');
const link = doc.querySelector('a');
const href = link.getAttribute('href');
this.$nextTick(() => {
pdfh5 = new Pdfh5('#demo', {
pdfurl: href,
});
})
}catch (e) {
this.isPdf = true
document.addEventListener('click', function (event) {
// 打印被点击的元素标签名和 class
if (event.target.tagName === 'IMG' && !['van-image__img', 'top_icon'].includes(event.target.className)) {
vant.ImagePreview({
images: [event.target.src],
closeable: true,
})
}
})
}
this.$nextTick(() => {
pdfh5.on("complete", function () {
const imgDoc = document.querySelectorAll('img')
let array = []
let classArray = []
imgDoc.forEach(o => {
if(!['van-image__img', 'top_icon'].includes(o.getAttribute('class'))) {
classArray.push(o.getAttribute('class'))
array.push(o.getAttribute('src'))
}
})
document.addEventListener('click', function (event) {
// 打印被点击的元素标签名和 class
if (event.target.tagName === 'IMG' && !['van-image__img', 'top_icon'].includes(event.target.className)) {
const index = classArray.indexOf(event.target.className)
if(index !== -1) {
vant.ImagePreview({
images: array,
startPosition: index,
closeable: true,
})
}
}
})
})
})
}
})
</script>
@@ -3,6 +3,10 @@ layout("/mobile/platform.html"){
#-->
<style>
#app {
font-family: ,serif;
}
.container img {
background-size: contain;
width: 100%;
@@ -11,13 +15,25 @@ layout("/mobile/platform.html"){
display: block;
}
.backTop {
display: none !important;
}
.header {
padding: 20px;
padding: 10px 10px 10px 10px;
}
.content {
line-height: 26px;
padding: 0px 20px 56px 20px;
padding: 0 10px 56px 10px;
max-height: calc(100vh - 46px - 210px - 60px - 24px);
overflow-y: auto;
}
.pdf_div {
padding-bottom: 70px;
/*height: 800px;*/
height: calc(100vh - 46px - 210px - 60px - 24px);
}
.title {
@@ -195,87 +211,138 @@ layout("/mobile/platform.html"){
background-color: white;
}
.van-tag {
color: white !important;
}
table {
width: 100%
}
</style>
<div id="app" v-cloak>
<van-sticky>
<van-nav-bar @click-left="history.go(-1)" fixed left-arrow placeholder title="职工疗休养-线路介绍"></van-nav-bar>
<van-nav-bar @click-left="history.go(-1)" fixed left-arrow placeholder
title="职工疗休养-线路介绍"></van-nav-bar>
</van-sticky>
<!--线路详情-->
<van-skeleton title :loading="skeLoading" :row="12">
<div class="container">
<div class="header">
<div class="title">
<van-tag size="large" color="#1867b0" style="color: white;position: relative; top: -2px">
{{lineData.lotName}}
</van-tag>
{{lineData.lineName}}
</div>
<div style="margin-top: 10px">
<div>
<span class="line_label">成团人数:</span>
{{lineData.minimumGroupSize ? lineData.minimumGroupSize : 0}}人(最少)
<template v-if="isLoad">
<!--线路详情-->
<van-skeleton title :loading="skeLoading" :row="12">
<div class="container">
<div class="header">
<div class="title">
<van-tag size="large" color="#1867b0" style="position: relative; top: -2px">
{{lineData.lotName}}
</van-tag>
{{lineData.lineName}}
</div>
<div>
<span>当前报名:</span>
{{lineData.signUpUserNum + lineData.signUpUserFamilyNum + '(家属' + lineData.signUpUserFamilyNum +
'人)'}}
</div>
<div>
<span>报名时间:</span>
{{moment(lineData.signUpStartTime).format('YYYY-MM-DD HH:mm') + ' ~ ' +
moment(lineData.signUpEndTime).format('YYYY-MM-DD HH:mm')}}
</div>
<div>
<span>出行时间</span>
{{moment(lineData.playStartTime).format('YYYY-MM-DD HH:mm') + ' ~ ' +
moment(lineData.playEndTime).format('YYYY-MM-DD HH:mm')}}
</div>
<div>
<span>&ensp;&ensp;社:</span>
{{lineData.travelAgencyName}}
</div>
<div>
<span>联系方式:</span>
{{lineData.contactMobileNumber}}
<div style="margin-top: 10px">
<div v-if="lineData.regionalNature == '省内'">
<div>
<span class="line_label">预计费用:</span>
<label>{{lineData.estimatedCost}}元</label>
</div>
<div v-if="configData.familyInfo == 2">
<!--<span>当前报名:</span>
{{lineData.signUpUserNum + lineData.signUpUserFamilyNum + '(家属' + lineData.signUpUserFamilyNum
+
'人)'}}-->
<span>当前报名</span>
{{lineData.signUpUserNum + lineData.signUpUserFamilyNum + '人'}}
</div>
<div v-else>
<span>当前报名:</span>
<!--{{lineData.signUpUserNum + lineData.familyNumber + '(家属' + lineData.familyNumber
+
'人)'}}-->
{{lineData.signUpUserNum + lineData.familyNumber + '人'}}
</div>
<!--<div>
<span class="line_label">成团人数包括家属:</span>
<label v-if="lineData.estimatedFamilyNumbers">{{lineData.estimatedFamilyNumbers}}人</label>
<label v-else>不限制</label>
</div>-->
</div>
<div v-else>
<div>
<span class="line_label">预计费用:</span>
<label>{{lineData.estimatedCost}}元</label>
</div>
<div v-if="configData.familyInfo == 2">
<span>当前报名:</span>
<!--{{lineData.signUpUserNum + '(家属' + lineData.signUpUserFamilyNum
+
'人)'}}-->
{{lineData.signUpUserNum + '人'}}
</div>
<div v-else>
<span>当前报名:</span>
<!--{{lineData.signUpUserNum + '(家属' + lineData.familyNumber
+
'人)'}}-->
{{lineData.signUpUserNum + '人'}}
</div>
</div>
<div>
<span>报名时间:</span>
{{moment(lineData.signUpStartTime).format('YYYY-MM-DD HH:mm') + ' ~ ' +
moment(lineData.signUpEndTime).format('YYYY-MM-DD HH:mm')}}
</div>
<div>
<span>出行时间:</span>
{{moment(lineData.playStartTime).format('YYYY-MM-DD HH:mm') + ' ~ ' +
moment(lineData.playEndTime).format('YYYY-MM-DD HH:mm')}}
</div>
<div>
<span>&ensp;&ensp;社:</span>
{{lineData.travelAgencyName}}
</div>
<div>
<span>联系方式:</span>
{{lineData.contactMobileNumber}}
</div>
<!--<div>
<span class="line_label">最少成团人数(包括家属):</span>
<label>{{configData.outsideQuota}}人</label>
</div>-->
</div>
</div>
<van-divider :style="{ color: 'orange', fontSize: '12px' }">上下滑动翻页,单击查看图片,再单击返回</van-divider>
<!--<div v-if="lineData.content" v-html="lineData.content" class="content"></div>
<div v-else v-html="configData.notice" class="content"></div>-->
<div v-if="isPdf" v-html="lineData.content" class="content"></div>
<div v-else id="demo" class="pdf_div"></div>
<!--<van-empty
v-else class="custom-image"
image="https://img01.yzcdn.cn/vant/custom-empty-image.png"
description="暂无详细信息"
></van-empty>-->
</div>
<van-divider></van-divider>
<div v-if="lineData.content" v-html="lineData.content" class="content"></div>
<div v-else v-html="configData.notice" class="content"></div>
<!--<van-empty
v-else class="custom-image"
image="https://img01.yzcdn.cn/vant/custom-empty-image.png"
description="暂无详细信息"
></van-empty>-->
</div>
</van-skeleton>
</van-skeleton>
<!--置顶图标-->
<image v-if="btnFlag" @click="backTop" src="/assets/mobile/svg/therapyRecuperation/top.svg"
class="top_icon"></image>
<!--置顶图标-->
<image v-if="btnFlag" @click="backTop" src="/assets/mobile/svg/therapyRecuperation/top.svg"
class="top_icon"></image>
<!--底部报名按钮-->
<div class="footer" v-if="fromUrlByMy != 'edit'">
<template v-if="lineData.isNormal==0&&lineData.isNormalFalse>0">
<van-button @click="join"
class="join">我要报名
</van-button>
</template>
<template v-else>
<!--底部报名按钮-->
<div class="footer" v-if="fromUrlByMy != 'edit'">
<van-button v-if="moment().unix() <= moment(lineData.signUpEndTime).unix()" @click="join"
class="join">我要报名
class="join">{{ enrollId ? '修改报名' : '我要报名' }}
</van-button>
<van-button v-if="moment().unix() > moment(lineData.signUpEndTime).unix()" class="join">报名结束</van-button>
</template>
<van-button v-if="moment().unix() > moment(lineData.signUpEndTime).unix()" class="join">报名结束
</van-button>
</div>
</template>
</div>
<!--报名弹出框-->
<van-popup v-model:show="joinPopup" position="right" class="joinPopup">
<van-nav-bar @click-left="joinPopup = false" fixed left-arrow placeholder title="疗休养报名"></van-nav-bar>
<van-nav-bar @click-left="signType == '2' ? history.go(-1) : joinPopup = false" fixed left-arrow placeholder title="疗休养报名"></van-nav-bar>
<div class="join_content">
<van-form @submit="joinSubmit">
@@ -289,26 +356,37 @@ layout("/mobile/platform.html"){
<div class="van-card-body">
<van-field label="姓名" readonly v-model="formData.userName"></van-field>
<van-field label="工号" readonly v-model="formData.loginName"></van-field>
<van-field label="身份证" name="idCard" :rules="[{ required: true }]"
placeholder="请填写身份证号" v-model="formData.idCard"></van-field>
<van-field label="身份证" name="idCard" :rules="[{ required: true }]"
placeholder="请填写身份证号、护照、台胞证等" v-model="formData.idCard"></van-field>
<van-field label="手机号" name="mobile" :rules="[{ required: true }]"
placeholder="请填写手机号" v-model="formData.mobile"></van-field>
<van-field label="所属工会" readonly v-model="formData.unionName"></van-field>
<van-field label="报名线路" readonly v-model="formData.lineName"></van-field>
<van-field v-if="signType != '2'" label="报名线路" readonly v-model="formData.lineName"></van-field>
</div>
</div>
<!--床位信息-->
<div class="van-doc-card" style="margin-bottom: 16px">
<div v-if="configData.bedInfo === true" class="van-doc-card" style="margin-bottom: 16px">
<div></div>
<div class="van-card-header">
床位信息
房间信息
</div>
<div class="van-card-body">
<van-field @click="self = true; roomVisible = true" readonly is-link label="房" name="bedType"
<van-field :rules="[{ required: true, message: '请选择是否包房' }]" label="是否包房" name="bedType">
<template #input>
<van-radio-group direction="horizontal" v-model="formData.bedInfo.bedType">
<van-radio name="包房" shape="square">包房</van-radio>
<van-radio name="不包房" shape="square">不包房</van-radio>
</van-radio-group>
</template>
</van-field>
<div>
<span style="color: red;margin-left: 14px;font-size: 14px">包房需自费;不包房两位老师一间且随机分配</span>
</div>
<!--<van-field @click="self = true; roomVisible = true" readonly is-link label="房间" name="bedType"
placeholder="请选择房间" v-model="formData.bedInfo.bedType"
:rules="[{ required: true }]"></van-field>
<van-field v-if="formData.bedInfo.bedType == '标准间'" @click="self = true; bedVisible = true"
:rules="[{ required: true }]"></van-field>-->
<!--<van-field v-if="formData.bedInfo.bedType == '标准间'" @click="self = true; bedVisible = true"
readonly is-link label="床位"
name="bedNum" placeholder="请选择床位" v-model="formData.bedInfo.bedNum"
:rules="[{ required: true }]"></van-field>
@@ -324,12 +402,12 @@ layout("/mobile/platform.html"){
<van-field v-if="formData.bedInfo.bedType == '标准间' && formData.bedInfo.isSleepTogether == true"
label="意向拼房人" name="otherSleepUser" placeholder="多个拼房人请用,隔开"
v-model="formData.bedInfo.otherSleepUser"
:rules="[{ required: true }]"></van-field>
:rules="[{ required: true }]"></van-field>-->
</div>
</div>
<!--随行人信息-->
<div class="van-doc-card" style="margin-bottom: 16px">
<div v-if="index != 2" class="van-doc-card" style="margin-bottom: 16px">
<div></div>
<div class="van-card-header"
style="display: flex; justify-content: space-between; align-items: center">
@@ -339,62 +417,73 @@ layout("/mobile/platform.html"){
<van-tag @click="addCompanion" size="large" type="primary" color="#1867b0">添加随行人</van-tag>
</div>
</div>
<div v-if="formData.companionList.length > 0" class="van-card-body">
<van-tabs v-model="active" type="card" color="#0e78c5" animated>
<van-tab v-for="item, index in formData.companionList" :title="'随行人' + (index + 1)">
<van-field label="姓名" name="userName" placeholder="请填写姓名" v-model="item.userName"
:rules="[{ required: true }]"></van-field>
<!--<van-field label="工号" name="loginName" placeholder="若没有工号,请忽略此项" v-model="item.loginName"></van-field>-->
<van-field label="年龄" name="age" placeholder="请填写年龄" v-model="item.age"
type="digit" :rules="[{ required: true }]"></van-field>
<van-field :rules="[{ required: true, message: '请选择性别' }]" label="性别" name="validator">
<template #input>
<van-radio-group direction="horizontal" v-model="item.sex">
<van-radio name="男" shape="square"></van-radio>
<van-radio name="女" shape="square"></van-radio>
</van-radio-group>
</template>
</van-field>
<van-field label="身份证号" name="idCard" placeholder="请填写身份证号"
:rules="[{ required: true }]" type="digit"
v-model="item.idCard"></van-field>
<van-field label="手机号" name="mobile" placeholder="请填写手机号"
:rules="[{ required: true }]" type="digit"
v-model="item.mobile"></van-field>
<van-field @click="companionVisible = true" readonly is-link label="与本人关系"
name="relation"
placeholder="随行人与本人关系" v-model="item.relation"
:rules="[{ required: true }]"></van-field>
<van-field @click="self = false; roomVisible = true" readonly is-link label="房间"
name="bedType" placeholder="请选择房间"
v-model="item.bedInfo.bedType"></van-field>
<div style="font-size: 12px; color:orangered; padding-left: 16px; padding-bottom: 4px">
提醒:如果跟报名人员同一房间,无须选择!
</div>
<van-field v-if="item.bedInfo.bedType == '标准间'" @click="self = false; bedVisible = true"
readonly is-link label="床位"
name="bedNum" placeholder="请选择床位" v-model="item.bedInfo.bedNum"></van-field>
<van-field v-if="item.bedInfo.bedType == '标准间'"
:rules="[{ validator, message: '请选择是否拼房' }]" label="是否拼房">
<template #input>
<van-radio-group direction="horizontal" v-model="item.bedInfo.isSleepTogether">
<van-radio :name="true" shape="square"></van-radio>
<van-radio :name="false" shape="square"></van-radio>
</van-radio-group>
</template>
</van-field>
<van-field v-if="item.bedInfo.bedType == '标准间' && item.bedInfo.isSleepTogether == true"
label="意向拼房人" name="otherSleepUser" placeholder="多个拼房人请用,隔开"
v-model="item.bedInfo.otherSleepUser"></van-field>
</van-tab>
</van-tabs>
</div>
<div v-if="formData.companionList.length == 0" class="companionList_empty_text">
<template v-if="configData.familyInfo === 2">
<div>
<span style="color: red;margin-left: 20px;font-size: 14px">限填写3岁以上70岁以下随行人</span>
</div>
<div v-if="formData.companionList.length > 0" class="van-card-body">
<van-tabs v-model="active" type="card" color="#0e78c5" animated>
<van-tab v-for="item, index in formData.companionList" :title="'随行人' + (index + 1)">
<van-field label="姓名" name="userName" placeholder="请填写姓名" v-model="item.userName"
:rules="[{ required: true }]"></van-field>
<!--<van-field label="工号" name="loginName" placeholder="若没有工号,请忽略此项" v-model="item.loginName"></van-field>-->
<van-field label="年龄" name="age" placeholder="请填写年龄" v-model="item.age"
type="digit" :rules="[{ required: true }]"></van-field>
<van-field :rules="[{ required: true, message: '请选择性别' }]" label="性别" name="validator">
<template #input>
<van-radio-group direction="horizontal" v-model="item.sex">
<van-radio name="男" shape="square"></van-radio>
<van-radio name="女" shape="square"></van-radio>
</van-radio-group>
</template>
</van-field>
<van-field label="身份证件" name="idCard" placeholder="输入身份证自动填充年龄与性别"
:rules="[{ required: true }]" maxlength="18"
@input="getAgeAndSex(item)" v-model="item.idCard"></van-field>
<van-field label="手机号" name="mobile" placeholder="请填写手机号"
:rules="[{ required: true }]" type="digit"
v-model="item.mobile"></van-field>
<van-field @click="companionVisible = true" readonly is-link label="与本人关系"
name="relation"
placeholder="随行人与本人关系" v-model="item.relation"
:rules="[{ required: true }]"></van-field>
<!--<van-field @click="self = false; roomVisible = true" readonly is-link label="房间"
name="bedType" placeholder="请选择房间"
v-model="item.bedInfo.bedType"></van-field>
<div style="font-size: 8px; color:orangered; padding-left: 16px; padding-bottom: 4px">
提醒:如果跟报名人员同一房间,无须选择!
</div>
<van-field v-if="item.bedInfo.bedType == '标准间'" @click="self = false; bedVisible = true"
readonly is-link label="床位"
name="bedNum" placeholder="请选择床位" v-model="item.bedInfo.bedNum"></van-field>
<van-field v-if="item.bedInfo.bedType == '标准间'"
:rules="[{ validator, message: '请选择是否拼房' }]" label="是否拼房">
<template #input>
<van-radio-group direction="horizontal" v-model="item.bedInfo.isSleepTogether">
<van-radio :name="true" shape="square">是</van-radio>
<van-radio :name="false" shape="square">否</van-radio>
</van-radio-group>
</template>
</van-field>
<van-field v-if="item.bedInfo.bedType == '标准间' && item.bedInfo.isSleepTogether == true"
label="意向拼房人" name="otherSleepUser" placeholder="多个拼房人请用,隔开"
v-model="item.bedInfo.otherSleepUser"></van-field>-->
</van-tab>
</van-tabs>
</div>
<div v-if="formData.companionList.length == 0" class="companionList_empty_text">
<span>
如有随行人出行,请添加随行人
</span>
</div>
</div>
</template>
<template v-else>
<van-field label="家属数量" name="familyNumber" placeholder="请填写家属数量" v-model="formData.familyNumber"
type="digit" :rules="[{ required: true }]"></van-field>
</template>
</div>
<div class="submitButton">
@@ -410,34 +499,35 @@ layout("/mobile/platform.html"){
<!--房间类型弹出框-->
<van-popup position="bottom" round v-model="roomVisible">
<van-picker
title="入住房间" show-toolbar
:columns="roomColumns"
@confirm="roomConfirm"
@cancel="roomCancel">
title="入住房间" show-toolbar
:columns="roomColumns"
@confirm="roomConfirm"
@cancel="roomCancel">
</van-picker>
</van-popup>
<!--床位弹出框-->
<van-popup position="bottom" round v-model="bedVisible">
<van-picker
title="床位" show-toolbar
:columns="bedColumns"
@confirm="bedConfirm"
@cancel="bedVisible = false">
title="床位" show-toolbar
:columns="bedColumns"
@confirm="bedConfirm"
@cancel="bedVisible = false">
</van-picker>
</van-popup>
<!--随行人关系弹出框-->
<van-popup position="bottom" round v-model="companionVisible">
<van-picker
title="与本人关系" show-toolbar
:columns="companionColumns"
@confirm="(value, index) => {formData.companionList[active].relation = value; companionVisible = false}"
@cancel="companionVisible = false">
title="与本人关系" show-toolbar
:columns="companionColumns"
@confirm="(value, index) => {formData.companionList[active].relation = value; companionVisible = false}"
@cancel="companionVisible = false">
</van-picker>
</van-popup>
</div>
<script>
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
@@ -446,15 +536,18 @@ layout("/mobile/platform.html"){
return null;
}
let pdfh5 = null
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
isPdf: false,
isLoad: false,
active: 0,
roomColumns: ['大床房', '标准间'],
roomColumns: ['房', '默认房间'],
bedColumns: ['1', '2'],
companionColumns: ['亲属', '朋友'],
companionColumns: ['配偶', '子女', '亲属', '其他'],
bedVisible: false,
roomVisible: false,
companionVisible: false,
@@ -466,7 +559,7 @@ layout("/mobile/platform.html"){
userName: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
unionName: "${@shiro.getPrincipalProperty('union').getUnionname()}",
idCard: "",
idCard: "${@shiro.getPrincipalProperty('idcard')}",
mobile: "${@shiro.getPrincipalProperty('mobile')}",
lineName: '',
takePartInLineId: '',
@@ -481,9 +574,24 @@ layout("/mobile/platform.html"){
fromUrlByMy: '',
enrollId: '',
configData: {},
signType: '',
takePartInTravelAgencyId: '',
queryYear: '',
}
},
methods: {
getAgeAndSex(item){
try {
const value = item.idCard
const age = this.calculateAgeFromIdCard(value)
this.$set(item, "age", age)
const sex = this.getGenderFromIdCard(value)
this.$set(item, "sex", sex)
} catch (error) {
console.log(error)
}
},
roomCancel() {
if (!this.self) {
this.formData.companionList[this.active].bedInfo.bedType = ''
@@ -510,19 +618,53 @@ layout("/mobile/platform.html"){
return value != null
},
async joinSubmit() {
const toast = vant.Toast.loading({
duration: 0,
forbidClick: true,
overlay: true,
message: '努力提交中',
})
const cloneData = clone(this.formData)
cloneData.companionList.forEach((item, index) => {
if (item.userName === '') {
cloneData.companionList.splice(index, 1)
}
})
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/doSignUpForLine', {
if (cloneData.companionList) {
for (let i = 0; i < cloneData.companionList.length; i++) {
const companion = cloneData.companionList[i];
// 检查每个字段是否为空
if (!companion.userName || !companion.idCard || !companion.mobile || !companion.relation) {
this.$toast('请填写完整随行人信息')
return
}
// 填了身份证,校验是否正确
if (companion.idCard) {
if (!this.validateIdCard(companion.idCard)) {
this.$toast('随行人'+ (i+1) +'的身份证不正确')
return
} else {
// 判断companion.age,是不是在3到70岁之间,不是就提示
if (companion.age < 3 || companion.age > 70) {
this.$toast('随行人'+ (i+1) +'的年龄超出限制,请天添加其他联系人')
return
}
}
}
}
}
let url = ''
if(this.signType == '2') {
cloneData.takePartInTravelAgencyId = this.takePartInTravelAgencyId
url = '/platform/theRapyRecuperation/line/enroll/doSignUpForTravelAgency'
} else {
url = '/platform/theRapyRecuperation/line/enroll/doSignUpForLine'
}
const toast = vant.Toast.loading({
duration: 0,
forbidClick: true,
overlay: true,
message: '努力提交中',
})
const resp = await $.post(url, {
enroll: JSON.stringify(cloneData),
})
setTimeout(() => {
@@ -537,7 +679,7 @@ layout("/mobile/platform.html"){
toast.clear()
}, 500)
if (resp.code === 0) {
location.href = '/platform/mobile/theRapyRecuperation/myRecuperation?index=' + this.index
location.replace('/platform/mobile/theRapyRecuperation/myRecuperation?index=' + this.index)
}
}, 1000)
},
@@ -557,19 +699,21 @@ layout("/mobile/platform.html"){
}),
})
if (re.code !== 0) {
if(re.msg === '您今年已报名,如要继续报名请进入我的疗休养,取消已选择') {
if (re.msg === '您今年已报名,如要继续报名请进入我的疗休养,取消已选择') {
vant.Dialog.confirm({
title: '温馨提示',
message: re.msg,
confirmButtonText: '跳转页面',
}).then(() => {
location.href = '/platform/mobile/theRapyRecuperation/myRecuperation?index=' + this.index
}).catch(() => {});
}).catch(() => {
});
} else {
vant.Dialog.alert({
title: '温馨提示',
message: re.msg,
}).then(() => {})
}).then(() => {
})
}
return
}
@@ -593,7 +737,8 @@ layout("/mobile/platform.html"){
async getData() {
const res = await $.get('/platform/theRapyRecuperation/line/enroll/selectLineAllInfo', {
usId: this.id,
usUnionId: this.takePartInUnionId
usUnionId: this.takePartInUnionId,
year: this.queryYear
})
if (res.code === 0) {
this.lineData = res.data
@@ -641,10 +786,120 @@ layout("/mobile/platform.html"){
const resp = await $.get('/platform/theRapyRecuperation/TheRapyConfig/findOne')
this.configData = resp.data
},
calculateAgeFromIdCard(idCard) {
// 检查身份证号码是否合法
if (!idCard) {
throw new Error("Invalid ID card format")
}
let birthDateStr
let birthYear, birthMonth, birthDay
// 处理18位身份证号码
if (idCard.length === 18) {
birthDateStr = idCard.substring(6, 14)
birthYear = parseInt(birthDateStr.substring(0, 4), 10)
birthMonth = parseInt(birthDateStr.substring(4, 6), 10) - 1 // 月份从0开始
birthDay = parseInt(birthDateStr.substring(6, 8), 10)
}
// 处理15位身份证号码
else if (idCard.length === 15) {
birthDateStr = idCard.substring(6, 12)
birthYear = parseInt("19" + birthDateStr.substring(0, 2), 10) // 使用字符串拼接
birthMonth = parseInt(birthDateStr.substring(2, 4), 10) - 1 // 月份从0开始
birthDay = parseInt(birthDateStr.substring(4, 6), 10)
} else {
throw new Error("Invalid ID card format. Only 15 or 18 digits are supported.")
}
// 获取当前日期
const currentDate = new Date()
// 计算年龄
let age = currentDate.getFullYear() - birthYear
// 如果当前日期还没过生日,则年龄减1
if (currentDate.getMonth() < birthMonth || (currentDate.getMonth() === birthMonth && currentDate.getDate() < birthDay)) {
age -= 1
}
return age
},
getGenderFromIdCard(idCard) {
// 检查身份证号码是否合法
if (!idCard) {
throw new Error("Invalid ID card format")
}
let genderDigit
// 处理18位身份证号码
if (idCard.length === 18) {
genderDigit = parseInt(idCard.charAt(16), 10) // 第17位
}
// 处理15位身份证号码
else if (idCard.length === 15) {
genderDigit = parseInt(idCard.charAt(14), 10) // 第15位
} else {
throw new Error("Invalid ID card format. Only 15 or 18 digits are supported.")
}
// 判断性别
if (genderDigit % 2 === 0) {
return "女"
} else {
return "男"
}
},
validateIdCard(idCard) {
if (!idCard) {
return false
}
// 18位身份证号码校验
if (idCard.length === 18) {
const idCardRegex = /^[1-9]\d{5}(18|19|20)?\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}(\d|[Xx])$/
if (!idCardRegex.test(idCard)) {
return false
}
// 校验码计算
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
const checksums = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"]
let sum = 0
for (let i = 0; i < 17; i++) {
sum += idCard[i] * weights[i]
}
const checksum = checksums[sum % 11]
return checksum === idCard[17].toUpperCase()
}
// 15位身份证号码校验
else if (idCard.length === 15) {
const idCardRegex = /^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0|1|2][0-9])|10|20|30|31)\d{3}$/
return idCardRegex.test(idCard)
}
// 外国人或其他情况
else {
return false
}
},
},
async created() {
const loading = this.$toast({
duration: 0,
message: '正在加载线路信息',
forbidClick: true,
loadingType: 'spinner',
type: 'loading',
overlay: true
});
this.id = getQueryString('id') ? getQueryString('id') : ''
this.queryYear = getQueryString('queryYear') ? getQueryString('queryYear') : ''
this.index = getQueryString('index') ? getQueryString('index') : ''
this.signType = getQueryString('signType') ? getQueryString('signType') : ''
this.takePartInTravelAgencyId = getQueryString('takePartInTravelAgencyId') ? getQueryString('takePartInTravelAgencyId') : ''
await this.getConfigData()
//编辑传出来的参数
this.fromUrlByMy = getQueryString('fromUrlByMy') ? getQueryString('fromUrlByMy') : ''
@@ -653,16 +908,66 @@ layout("/mobile/platform.html"){
if (this.enrollId) {
await this.findSignUpInfoById()
}
this.getData()
if(!this.signType) {
await this.getData()
} else {
this.joinPopup = true
}
this.isLoad = true
try {
const parser = new DOMParser();
const doc = parser.parseFromString(this.lineData.content, 'text/html');
const link = doc.querySelector('a');
const href = link.getAttribute('href');
this.$nextTick(() => {
pdfh5 = new Pdfh5('#demo', {
pdfurl: href,
});
})
}catch (e) {
this.isPdf = true
document.addEventListener('click', function (event) {
// 打印被点击的元素标签名和 class
if (event.target.tagName === 'IMG' && event.target.className !== 'top_icon') {
vant.ImagePreview({
images: [event.target.src],
closeable: true,
})
}
})
}
this.$nextTick(() => {
pdfh5.on("complete", function () {
const imgDoc = document.querySelectorAll('img')
let array = []
let classArray = []
imgDoc.forEach(o => {
if(o.getAttribute('class') !== 'top_icon') {
classArray.push(o.getAttribute('class'))
array.push(o.getAttribute('src'))
}
})
document.addEventListener('click', function (event) {
// 打印被点击的元素标签名和 class
if (event.target.tagName === 'IMG' && event.target.className !== 'top_icon') {
const index = classArray.indexOf(event.target.className)
if(index !== -1) {
vant.ImagePreview({
images: array,
startPosition: index,
closeable: true,
})
}
}
})
})
})
loading.close()
},
mounted() {
window.addEventListener('scroll', this.scrollToTop)
document.addEventListener('click', function (event) {
// 打印被点击的元素标签名和 class
if (event.target.tagName === 'IMG' && event.target.className !== 'top_icon') {
vant.ImagePreview([event.target.src])
}
})
},
destroyed() {
window.removeEventListener('scroll', this.scrollToTop)
@@ -3,6 +3,10 @@ layout("/mobile/platform.html"){
#-->
<style>
#app {
font-family: ,serif;
}
.van-doc-card {
margin: 10px;
padding: 12px 12px 12px 12px;
@@ -77,21 +81,22 @@ layout("/mobile/platform.html"){
.footer {
background-color: white;
position: fixed;
bottom: 0;
width: 100%;
height: 60px;
display: flex;
justify-content: space-evenly;
align-items: center;
left: 0;
}
.footer .van-button {
height: 34px;
height: 30px;
font-size: 12px;
border-radius: 6px;
}
.van-divider {
margin: 8px 0;
}
.active {
background-color: #1867b0;
color: white;
@@ -109,9 +114,7 @@ layout("/mobile/platform.html"){
.van-row {
text-align: center;
color: #1867b0;
font-weight: bold;
padding: 0px 0px 10px 0px;
font-family: cursive;
}
.van-col {
@@ -122,17 +125,37 @@ layout("/mobile/platform.html"){
font-size: 12px;
}
.sign_button .van-button{
width: 72px;
height: 26px;
color: white;
background: rgb(24, 103, 176);
border-color: rgb(24, 103, 176);
font-size: 11px;
border-radius: 6px;
}
[v-cloak] {
display: none;
}
.van-action-sheet__cancel, .van-action-sheet__item {
font-size: 13px;
}
</style>
<div id="app" v-cloak>
<div id="app" v-cloak v-if="isLoad">
<van-sticky>
<van-nav-bar @click-left="history.back()" fixed left-arrow placeholder title="疗休养线路"></van-nav-bar>
<van-nav-bar @click-left="pjaxReplace('/platform/mobile/theRapyRecuperation/index')" fixed left-arrow placeholder title="疗休养线路"></van-nav-bar>
</van-sticky>
<van-dropdown-menu>
<!--<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.year" :options="yearArray"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
</van-dropdown-menu>-->
<!-- <van-notice-bar v-if="schoolTime != '' && schoolTime != null" mode="closeable">您的入校时间为{{schoolTime}},疗休养额度为1500。</van-notice-bar>-->
<!--按钮导航-->
<div class="choose_button van-doc-card">
@@ -145,47 +168,85 @@ layout("/mobile/platform.html"){
</div>
</van-grid-item>
</van-grid>
<van-divider></van-divider>
<!-- <div class="footer"-->
<!-- v-if="['0', 0].includes(pageForm.theRapyRecuperationType)">-->
<!-- <van-button :class="pageForm.lineUnionType == 2 ? 'active' : 'no_active'"-->
<!-- @click="otherUnionClick">-->
<!-- 其他分工会-->
<!-- </van-button>-->
<!-- <van-button :class="pageForm.lineUnionType == 1 ? 'active' : 'no_active'"-->
<!-- @click="pageForm.lineUnionType = 1; getData()">-->
<!-- 本分工会-->
<!-- </van-button>-->
<!-- <van-button :class="pageForm.lineUnionType == 3 ? 'active' : 'no_active'"-->
<!-- @click="pageForm.lineUnionType = 3; getData()">-->
<!-- 校工会-->
<!-- </van-button>-->
<!-- </div>-->
</div>
<van-list
:finished="finished"
:immediate-check="true"
@load="onLoad"
finished-text="没有更多了"
v-model="loading">
<div @click.stop="findOne(o)" class="list-card" v-for="o in tableData">
:finished="finished"
:immediate-check="true"
@load="onLoad"
finished-text="没有更多了"
v-model="loading">
<div @click.stop="clickLineRow(o)" class="list-card" v-for="o in tableData">
<div class="content">
<van-image
height="100"
radius="8"
:src="APP_DOMAIN + '/file_server/fileStreamPreview?id=' + o.fileId"
width="150">
height="86"
radius="8"
:src="CREATE_PREVIEW_URL(o.fileId)"
width="130">
</van-image>
<div v-if="pageForm.theRapyRecuperationType != '2' && pageForm.theRapyRecuperationType != '3'"
class="content-right">
<div class="cr-title">
<span>{{o.lineName}}</span>
<div>
<span style="font-size: 14px">{{o.lineName}}</span>
<!--<div>
<van-tag color="#1867b0">{{o.lotName}}</van-tag>
<van-tag color="#1867b0">{{o.signUpMode === 2 ? '校工会' :
o.usUnionName}}
</van-tag>
</div>
</div>-->
</div>
<div class="desc_info">
<!--<div class="union">
<span>组织形式:</span>{{o.createMode === 2 && o.signUpMode === 2 ? '校工会' : o.usUnionName}}
</div>-->
<div class="concat">
<!--<div class="concat" v-if="modifyConfig.familyInfo == 2">
<span>已报人数:</span>{{o.signUpUserNum + o.signUpUserFamilyNum + '(家属' +
o.signUpUserFamilyNum + '人)'}}
o.signUpUserFamilyNum + '人)'}}
</div>
<div class="mobile" style="color: red">
<span>出行时间:</span>{{moment(o.playStartTime).format('YYYY-MM-DD')}}
<div class="concat" v-else>
<span>已报人数:</span>{{o.signUpUserNum + o.familyNumber + '(家属' +
o.familyNumber + '人)'}}
</div>-->
<div class="concat">
<span>线路类型:</span>
{{o.regionalNature}}
</div>
<div class="concat">
<span>出行时段:</span>
{{o.lotName}}
</div>
<div class="mobile">
<span>&ensp;&ensp;社:</span>{{o.travelAgencyName}}
<!--<span>出行时间:</span>{{moment(o.playStartTime).format('YYYY-MM-DD')}}-->
<span>组织机构:</span>
{{o.signUpMode === 2 ? '校工会' : o.usUnionName}}
</div>
<!--<div class="mobile">
<span>旅&ensp;行&ensp;社:</span>{{o.travelAgencyName}}
</div>-->
</div>
</div>
@@ -204,10 +265,33 @@ layout("/mobile/platform.html"){
<!--<div class="mobile">
<span>邮箱:</span>{{o.email}}
</div>-->
<div class="union" style="margin-top: 0">
<span>&emsp;&emsp;网:</span><span style="color: #0e5996"
@click.stop="window.open(o.officialWebsite.indexOf('http') !== -1 ? o.officialWebsite : 'https://' + o.officialWebsite)">{{o.officialWebsite}}</span>
<div class="concat" v-if="modifyConfig.familyInfo == 2">
<span>已报人数:</span>{{o.signUpUserNum + '人'}}
</div>
<div class="concat" v-else>
<span>已报人数:</span>{{o.signUpUserNum + '人'}}
</div>
<!-- <div class="concat" v-if="modifyConfig.familyInfo == 2">-->
<!-- <span>已报人数:</span>{{o.signUpUserNum + o.signUpUserFamilyNum + '(家属' +-->
<!-- o.signUpUserFamilyNum + '人)'}}-->
<!-- </div>-->
<!-- <div class="concat" v-else>-->
<!-- <span>已报人数:</span>{{o.signUpUserNum + o.familyNumber + '(家属' +-->
<!-- o.familyNumber + '人)'}}-->
<!-- </div>-->
<!--<div class="union" style="margin-top: 0">
<span>官&emsp;&emsp;网:</span>
<span style="color: #0e5996"
@click.stop="window.open(o.officialWebsite.indexOf('http') !== -1 ? o.officialWebsite : 'https://' + o.officialWebsite)">
{{o.officialWebsite}}
</span>
</div>-->
</div>
</div>
@@ -233,41 +317,69 @@ layout("/mobile/platform.html"){
</div>
</div>
<div v-if="pageForm.theRapyRecuperationType == '2'">
<van-row gutter="20">
<div v-if="pageForm.theRapyRecuperationType == '3'">
<van-row gutter="20" class="sign_button">
<van-col @click="" span="12" style="border-right: 1px lightgrey solid"></van-col>
<van-col span="12">
<van-button @click.stop="join(o)" plain round size="mini" type="info">我要报名</van-button>
<van-col span="12" style="text-align: right">
<van-button @click.stop="openSignUser(o, 'base')" round size="mini" type="info">
查看人员
</van-button>
<van-button @click.stop="findOne(o)" round size="mini" type="info"
style="margin-right: 8px">
我要报名
</van-button>
</van-col>
</van-row>
</div>
</div>
</van-list>
<div class="footer"
v-if="['0', '1', 0 , 1].includes(pageForm.theRapyRecuperationType)">
<van-button :class="pageForm.lineUnionType == 2 ? 'active' : 'no_active'"
@click="otherUnionClick">
其他工会
</van-button>
<van-button :class="pageForm.lineUnionType == 1 ? 'active' : 'no_active'"
@click="pageForm.lineUnionType = 1; getData()">
本工会
</van-button>
<van-button :class="pageForm.lineUnionType == 3 ? 'active' : 'no_active'"
@click="pageForm.lineUnionType = 3; getData()">
校工会
</van-button>
</div>
<van-popup position="bottom" round v-model:show="unionPop">
<van-picker
title="选择分工会" show-toolbar
:columns="unionColumns"
@confirm="onConfirm"
@cancel="unionPop = false"
title="选择分工会" show-toolbar
:columns="unionColumns"
@confirm="onConfirm"
@cancel="unionPop = false"
></van-picker>
</van-popup>
<van-action-sheet
v-model="selectLinePopup"
cancel-text="取消"
:description="clickRow.lineName"
close-on-click-action>
<button v-for="(item,index) in selectLineList" type="button" class="van-action-sheet__item">
<div style="display: flex; justify-content: space-between; align-items: center">
<div>
<div class="van-action-sheet__name">{{item.name}}</div>
<div class="van-action-sheet__name">{{item.playTime}}</div>
<div class="van-action-sheet__subname">{{item.subname}}</div>
</div>
<div class="sign_button">
<div>
<van-button @click.stop="onSelect(item)" size="mini" type="info"
style="margin-right: 8px">
点击报名
</van-button>
</div>
<div style="margin-top: 4px">
<van-button @click.stop="openSignUser(item, 'line')" size="mini" type="info"
style="margin-right: 8px">
查看人员
</van-button>
</div>
</div>
</div>
</button>
</van-action-sheet>
<div>
<van-tabbar v-model="tarBarActive">
<van-tabbar-item icon="home-o" replace url="/platform/mobile/theRapyRecuperation/index">疗休养首页</van-tabbar-item>
<van-tabbar-item icon="search" replace url="/platform/mobile/theRapyRecuperation/mobileLineListPage">线路选择</van-tabbar-item>
<van-tabbar-item icon="manager-o" replace url="/platform/mobile/theRapyRecuperation/myRecuperation">我的报名</van-tabbar-item>
</van-tabbar>
</div>
</div>
<script>
@@ -278,33 +390,87 @@ layout("/mobile/platform.html"){
return null;
}
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
tarBarActive: 1,
searchKeyWord: '',
isLoad: false,
yearArray: [],
unionColumns: [],
unionPop: false,
chooseButton: [],
pageForm: {
theRapyRecuperationType: 0,
lineUnionType: 1,
lineUnionType: 3,
unionId: "${@shiro.getPrincipalProperty('union').getId()}",
year: new Date().getFullYear()
year: null
},
loading: false,
finished: false,
refreshing: false,
lineData: {},
modifyConfig:{},
clickRow: {},
selectLineList: [],
selectLinePopup: false,
// schoolTime: '',
}
},
methods: {
async openSignUser(row, type) {
const id = type === 'line' ? row.usId : row.id
location.href = '/platform/mobile/theRapyRecuperation/userSignInfo?type=' + type + '&id=' + id
},
async clickLineRow(o) {
this.clickRow = o
if(this.pageForm.theRapyRecuperationType == 3) {
await this.findOne(o)
return
}
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/getSelectLineById',
{
lineId: o.lineId,
unionId: this.pageForm.unionId,
theRapyRecuperationType: this.pageForm.theRapyRecuperationType,
lineUnionType: this.pageForm.lineUnionType,
}
)
this.selectLineList = resp.data
this.selectLineList.forEach((item, index) => {
item.name = '出行时间' + (index + 1) + ' ' + moment(item.playStartTime).format('YYYY-MM-DD HH:mm')
item.playTime = '报名截止:' + moment(item.signUpEndTime).format('YYYY-MM-DD HH:mm')
if(this.modifyConfig.familyInfo == 2) {
item.subname = '已报人数:'
+ (item.signUpUserNum + item.signUpUserFamilyNum)
+ '人'
} else {
item.subname = '已报人数:'
+ (item.signUpUserNum + item.signUpUserFamilyNum)
+ '人'
}
// if(this.modifyConfig.familyInfo == 2) {
// item.subname = '已报人数:'
// + (item.signUpUserNum + item.signUpUserFamilyNum)
// + '(家属' + item.signUpUserFamilyNum + '人)'
// } else {
// item.subname = '已报人数:'
// + (item.signUpUserNum + item.signUpUserFamilyNum)
// + '(家属' + item.familyNumber + '人)'
// }
})
this.selectLinePopup = true
},
onSelect(item) {
this.findOne(item)
},
otherUnionClick() {
if(this.unionColumns.length === 0) {
vant.Toast('暂时没有工会公开线路')
vant.Toast('暂时没有其他分工会公开线路')
return
}
this.pageForm.lineUnionType = 2
@@ -313,6 +479,9 @@ layout("/mobile/platform.html"){
doSearch() {
this.loading = true
this.finished = false
if (this.pageForm.theRapyRecuperationType == 0) {
this.$set(this.pageForm, 'lineUnionType', 3)
}
this.getData()
},
async join(o) {
@@ -365,14 +534,32 @@ layout("/mobile/platform.html"){
location.href = '/platform/mobile/theRapyRecuperation/lineInfo?id=' + o.usId + '&index=' + this.pageForm.theRapyRecuperationType
+ '&takePartInUnionId=' + o.takePartInUnionId
} else if (type === 3) {
location.href = '/platform/mobile/theRapyRecuperation/baseInfo?id=' + o.usId + '&index=' + this.pageForm.theRapyRecuperationType
location.href = '/platform/mobile/theRapyRecuperation/baseInfo?id=' + o.id + '&index=' + this.pageForm.theRapyRecuperationType
} else if(type === 2) {
const re = await $.post('/platform/theRapyRecuperation/line/enroll/validSignUpInfo', {
enroll: JSON.stringify({
takePartInTravelAgencyId: o.id,
}),
})
if (re.code !== 0) {
vant.Dialog.alert({
title: '温馨提示',
message: re.msg,
})
return
}
location.href = '/platform/mobile/theRapyRecuperation/lineInfo?id=' + o.usId + '&index=' + this.pageForm.theRapyRecuperationType
+ '&takePartInUnionId=' + o.takePartInUnionId + '&signType=2' + '&takePartInTravelAgencyId=' + o.id
}
},
getData() {
this.loading = true
if (this.pageForm.lineUnionType === 1) {
if (this.pageForm.lineUnionType === 3) {
this.pageForm.unionId = "${@shiro.getPrincipalProperty('union').getId()}"
}
if (this.pageForm.theRapyRecuperationType == 1) {
this.$set(this.pageForm, 'lineUnionType', 3)
}
this.pageForm.pageNumber = 1
this.tableData = []
this.onLoad()
@@ -394,26 +581,47 @@ layout("/mobile/platform.html"){
for (let i = 2023; i <= 2043; i++) {
this.yearArray.push({value: i, text: i + '年'})
}
this.yearArray.unshift({value: null, text: '全部'})
},
async getTheRapyUnions() {
const resp = await $.get('/platform/theRapyRecuperation/line/enroll/getTheRapyUnions', {
year: this.pageForm.year
year: this.pageForm.year,
theRapyRecuperationType: this.pageForm.theRapyRecuperationType
})
return resp.data
},
async getModifyConfig() {
const res = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne')
if (res.code === 0) {
this.modifyConfig = res.data
}
},
// async getSchoolTime() {
// const res = await $.post('/platform/theRapyRecuperation/line/enroll/getSchoolTime')
// this.schoolTime = res.data
// },
},
mounted() {
if(localStorage.getItem('clickIndex') !== null) {
const clickIndex = localStorage.getItem('clickIndex')
this.pageForm.theRapyRecuperationType = JSON.parse(clickIndex).clickIndex
}
if(this.pageForm.theRapyRecuperationType == 1){
this.$set(this.pageForm, 'lineUnionType', 3)
}
},
async created() {
this.createYear()
const clickIndex = localStorage.getItem('clickIndex')
this.pageForm.theRapyRecuperationType = JSON.parse(clickIndex).clickIndex
await this.getModifyConfig()
// await this.getSchoolTime()
this.chooseButton = await getEnumOptions('TheRapyRecuperationType')
this.chooseButton = this.chooseButton.filter(o => o.value !== 2 && o.value !== 3)
this.chooseButton = this.chooseButton.filter(o => o.value !== 2)
const unions = await this.getTheRapyUnions()
unions.forEach(item => {
this.unionColumns.push({text: item.unionname, value: item.id})
})
}
this.isLoad = true
},
})
</script>
@@ -72,21 +72,28 @@ layout("/mobile/platform.html"){
.footer {
background-color: white;
position: fixed;
bottom: 0;
width: 100%;
height: 60px;
display: flex;
justify-content: space-evenly;
align-items: center;
left: 0;
}
.footer .van-button {
height: 34px;
height: 30px;
font-size: 12px;
border-radius: 6px;
}
.evaluateVisible .van-button {
height: 30px;
font-size: 12px;
border-radius: 6px;
}
.van-divider {
margin: 8px 0;
}
.active {
background-color: #1867b0;
color: white;
@@ -172,11 +179,59 @@ layout("/mobile/platform.html"){
margin-left: 4px;
}
.evaluateVisible {
width: 100%;
height: 80%;
}
.title_container {
display: flex;
justify-content: flex-end;
align-items: center;
position: relative;
padding: 9px;
}
.title {
position: absolute;
left: 0;
right: 0;
margin: auto;
text-align: center;
}
.content {
padding: 10px 20px;
}
.line_info {
display: flex;
align-items: center;
}
.evaluate_item_content {
display: flex;
gap: 20px;
}
.evaluate_item {
padding: 6px 20px;
border: 1px grey solid;
text-align: center;
border-radius: 10px;
}
.evaluate_active {
background-color: #07C160;
color: white;
border-color: #07C160;
}
</style>
<div id="app" v-cloak>
<van-sticky>
<van-nav-bar @click-left="history.back()" fixed left-arrow placeholder
<van-nav-bar @click-left="pjaxReplace('/platform/mobile/theRapyRecuperation/index')" fixed left-arrow placeholder
title="我的疗休养"></van-nav-bar>
</van-sticky>
@@ -196,6 +251,14 @@ layout("/mobile/platform.html"){
</div>
</van-grid-item>
</van-grid>
<van-divider></van-divider>
<div class="footer">
<van-button @click="pageForm.signUpStateId = 1; getData()" :class="pageForm.signUpStateId == 1 ? 'active' : 'no_active'">已报名</van-button>
<van-button @click="pageForm.signUpStateId = 2; getData()" :class="pageForm.signUpStateId == 2 ? 'active' : 'no_active'">已参加</van-button>
<van-button @click="pageForm.signUpStateId = 3; getData()" :class="pageForm.signUpStateId == 3 ? 'active' : 'no_active'">未参加</van-button>
</div>
</div>
<van-list
@@ -209,7 +272,7 @@ layout("/mobile/platform.html"){
<van-image
height="100"
radius="8"
:src="APP_DOMAIN + '/file_server/fileStreamPreview?id=' + o.fileId"
:src="CREATE_PREVIEW_URL(o.fileId)"
width="150"
></van-image>
@@ -241,7 +304,8 @@ layout("/mobile/platform.html"){
<span>联系方式:</span>{{o.contactMobileNumber}}
</div>
<div class="mobile" v-if="![2715,2725,2735].includes(o.stateId)">
<span>随行家属:</span>{{o.companionUserNames ? o.companionUserNames : '无'}}
<span v-if="configData.familyInfo === 1">随行家属:</span>{{o.companionUserNames ? o.companionUserNames : '无'}}
<span v-else>随行家属:</span>{{o.familyNumber}}人
</div>
<div class="mobile" v-else>
<span>审核状态:</span><span :style="'color: ' + o.stateColor">{{o.stateName}}</span>
@@ -295,6 +359,9 @@ layout("/mobile/platform.html"){
</div>
<div class="operateDiv">
<van-button v-if="pageForm.signUpStateId == 2" @click="openEvaluate(o)" type="info" size="small" color="#1867b0">
&ensp;
</van-button>
<van-button v-if="pageForm.theRapyRecuperationType != '2' && moment().unix() < moment(o.changeEndTime).unix()
&& ![2715,2725,2735].includes(o.stateId)" @click="edit(o)"
type="info" size="small" color="#1867b0" :disabled="o.isTakePartIn == true || getDisabled(o)">
@@ -302,21 +369,15 @@ layout("/mobile/platform.html"){
</van-button>
<van-button type="info" size="small" color="#1867b0" @click="cancel(o)"
:disabled="getDisabled(o)">
&ensp;
&ensp;
</van-button>
<van-button v-if="o.isTakePartIn == true" type="info" size="small" color="#1867b0"
@click="satisfaction(o)">满意度反馈</van-button>
<!--<van-button v-if="o.isTakePartIn == true" type="info" size="small" color="#1867b0"
@click="satisfaction(o)">满意度反馈</van-button>-->
</div>
</div>
</van-list>
<div class="footer">
<van-button @click="pageForm.signUpStateId = 1; getData()" :class="pageForm.signUpStateId == 1 ? 'active' : 'no_active'">已报名</van-button>
<van-button @click="pageForm.signUpStateId = 2; getData()" :class="pageForm.signUpStateId == 2 ? 'active' : 'no_active'">已参加</van-button>
<van-button @click="pageForm.signUpStateId = 3; getData()" :class="pageForm.signUpStateId == 3 ? 'active' : 'no_active'">未参加</van-button>
</div>
<van-popup class="popVisible" position="right" v-model="popVisible">
<van-nav-bar @click-left="popVisible = false" fixed left-arrow placeholder title="满意度评分"></van-nav-bar>
<div class="cus_content">
@@ -352,15 +413,53 @@ layout("/mobile/platform.html"){
</div>
</van-popup>
<van-action-sheet title="参加体验评价" v-model="evaluatePopup">
<div class="evaluateForm">
<div style="text-align: center;margin: 20px 0;font-size: 20px;color: #f18d8d;font-weight: bold;">
您的评价让我们做的更好
</div>
<div style="display: flex;justify-content: center;flex-direction: column;align-items: center">
<div style="text-align: center;font-size: 13px;color: rgb(139 134 134); margin-bottom: 10px">为本次疗休养打分
</div>
<div class="evaluate_item_content">
<div class="evaluate_item" @click="evaluateClick('满意', 1)">满意</div>
<div class="evaluate_item" @click="evaluateClick('一般', 2)">一般</div>
<div class="evaluate_item" @click="evaluateClick('不满意', 3)">不满意</div>
</div>
</div>
<van-field
autosize
class="evaluateTextField"
label="评价"
label-width="0"
maxlength="100"
placeholder="请输入评价"
rows="5"
type="textarea"
v-model="evaluateFormData.evaluateText"
>
<div slot="label"></div>
</van-field>
</div>
<div style="padding: 10px 16px">
<van-button @click="doSubmitEvaluate"
block
type="primary"
>提交
</van-button>
</div>
</van-action-sheet>
<div>
<van-tabbar v-model="tarBarActive">
<van-tabbar-item icon="home-o" replace url="/platform/mobile/theRapyRecuperation/index">疗休养报名
</van-tabbar-item>
<van-tabbar-item icon="manager-o" replace url="/platform/mobile/theRapyRecuperation/myRecuperation">我的疗休养
</van-tabbar-item>
<van-tabbar-item icon="home-o" replace url="/platform/mobile/theRapyRecuperation/index">疗休养首页</van-tabbar-item>
<van-tabbar-item icon="search" replace url="/platform/mobile/theRapyRecuperation/mobileLineListPage">线路选择</van-tabbar-item>
<van-tabbar-item icon="manager-o" replace url="/platform/mobile/theRapyRecuperation/myRecuperation">我的报名</van-tabbar-item>
</van-tabbar>
</div>
</div>
<script>
@@ -376,23 +475,82 @@ layout("/mobile/platform.html"){
mixins: [mobileMixins],
data() {
return {
tarBarActive: 2,
evaluateFormData: {},
evaluatePopup: false,
yearArray: [],
popVisible: false,
chooseButton: [],
pageForm: {
theRapyRecuperationType: null,
signUpStateId: 1,
year: null,
year: new Date().getFullYear(),
},
loading: false,
finished: false,
refreshing: false,
satisfactionForm: {},
configData: {},
tarBarActive: 1
}
},
methods: {
async openEvaluate(o) {
if(o.isTakePartIn === false) {
this.$modal.msg("参加后才能评价")
return
}
await this.finOneEvaluate(o.takePartInLineId)
this.evaluatePopup = true
this.$nextTick(() => {
let score = 1
if (this.evaluateFormData.evaluateScore === '满意') {
score = 1
} else if (this.evaluateFormData.evaluateScore === '一般') {
score = 2
} else if (this.evaluateFormData.evaluateScore === '不满意') {
score = 3
}
this.evaluateClick(this.evaluateFormData.evaluateScore, score)
})
},
evaluateClick(value, index) {
this.evaluateFormData.evaluateScore = value
const elements = document.querySelectorAll('.evaluate_item')
for (let i = 0; i < elements.length; i++) {
if(index === (i + 1)) {
elements[i].classList.add('evaluate_active')
} else {
elements[i].classList.remove('evaluate_active')
}
}
},
async finOneEvaluate(lineId) {
const {data, code, msg} = await $.post("/platform/theRapyRecuperation/line/enroll/finOneEvaluate", {
lineId: lineId,
})
if (code === 0) {
if (data) {
this.evaluateFormData = data
} else {
this.evaluateFormData = {lineId: lineId}
}
} else {
this.$message.warning(msg)
}
},
async doSubmitEvaluate() {
if (!this.evaluateFormData.evaluateScore) {
this.$modal.msg("请为本次疗休养评分")
return
}
const {code, data, msg} = await $.post('/platform/theRapyRecuperation/line/enroll/doEvaluate', this.evaluateFormData)
if (code === 0) {
this.$modal.msgSuccess("评价成功")
this.evaluatePopup = false
} else {
this.$modal.msgError(msg)
}
},
getDisabled(o) {
if(o.regionalNature === '省内') {
return this.configData.isSnLine && o.stateId === 2750
@@ -465,11 +623,11 @@ layout("/mobile/platform.html"){
}
vant.Dialog.confirm({
title: '温馨提醒',
message: '您确定要取消此报名吗?',
message: '您确定要撤销此报名吗?',
}).then(async () => {
const res = await $.post('/platform/theRapyRecuperation/line/enroll/doDeleteMyEnrollInfoById/' + o.id)
if(res.code === 0) {
vant.Toast('取消成功')
vant.Toast('撤销成功')
this.getData()
}else {
vant.Toast(res.msg)
@@ -477,8 +635,10 @@ layout("/mobile/platform.html"){
}).catch(() => {});
},
async findOne(o) {
if(this.pageForm.theRapyRecuperationType != '2') {
if(this.pageForm.theRapyRecuperationType != '2' && this.pageForm.theRapyRecuperationType != '3') {
location.href = '/platform/mobile/theRapyRecuperation/lineInfo?id=' + o.takePartInLineId + '&fromUrlByMy=edit&takePartInUnionId=' + o.takePartInUnionId
} else if (this.pageForm.theRapyRecuperationType == '3') {
location.href = '/platform/mobile/theRapyRecuperation/baseInfo?id=' + o.takePartInBaseManagementId + '&fromUrlByMy=edit'
}
},
getData() {
@@ -516,17 +676,13 @@ layout("/mobile/platform.html"){
},
async created() {
this.createYear()
this.yearArray.unshift({value: null, text: '全部'})
this.pageForm.year = new Date().getFullYear()
this.yearArray.unshift({value: null, text: '所有年度'})
this.pageForm.theRapyRecuperationType = getQueryString('index') ? getQueryString('index') : await this.getType()
this.chooseButton = await getEnumOptions('TheRapyRecuperationType')
this.chooseButton = this.chooseButton.filter(o => o.value !== 2 && o.value !== 3)
this.chooseButton = this.chooseButton.filter(o => o.value !== 2)
await this.getConfigData()
this.onLoad()
},
mounted() {
}
})
</script>
@@ -0,0 +1,84 @@
<!--#
layout("/mobile/platform.html"){
#-->
<style>
#app {
font-family: ,serif;
}
.van-index-bar {
margin-bottom: 20px;
}
.van-empty {
height: calc(100vh - 46px - 54px);
position: unset;
transform: none;
}
</style>
<div id="app" v-cloak>
<van-sticky>
<van-nav-bar @click-left="history.back()" fixed left-arrow placeholder
title="报名人员"></van-nav-bar>
</van-sticky>
<van-search v-model="searchKeyWord" placeholder="请输入姓名查询" @search="getSignUser"></van-search>
<template v-if="Object.keys(signUserData).length > 0">
<van-index-bar :sticky-offset-top="46" :index-list="Object.keys(signUserData)">
<template v-for="(value, key) in signUserData">
<van-index-anchor :index="key"></van-index-anchor>
<van-cell v-for="item in value" :title="item.userName + '' + item.unionName + ''"></van-cell>
</template>
</van-index-bar>
</template>
<van-empty v-else description="暂无报名人员"></van-empty>
</div>
<script>
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return decodeURI(r[2]);
return null;
}
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
searchKeyWord: '',
signUserData: [],
id: '',
type: '',
}
},
methods: {
async getSignUser() {
const params = this.type === 'line' ? {usId: this.id, searchKeyWord: this.searchKeyWord} : {baseId: this.id, searchKeyWord: this.searchKeyWord}
const toast = vant.Toast.loading({
duration: 0,
forbidClick: true,
overlay: true,
message: '努力查询中',
})
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/openSignUser', params)
this.signUserData = resp.data
toast.close()
},
},
async created() {
this.id = getQueryString('id')
this.type = getQueryString('type')
await this.getSignUser()
},
})
</script>
<!--#
}
#-->
@@ -527,7 +527,6 @@ layout("/mobile/platform.html"){
this.selectSpecsPopup = true
},
specsSelectConfirm(value) {
debugger
this.selectSpecsPopup = false
if (value) {
this.projectInfo.welfareProjectSubjects[0].options.forEach(v => {
@@ -681,7 +680,7 @@ layout("/mobile/platform.html"){
for (const option of options) {
// 检查是否有 specs
if (option.specs) {
if (option.specs && option.specs.length > 0) {
// 检查 selectSpecs 是否为空或未定义
if (!option.selectSpecs) {
this.$toast.fail('请选择' + option.optionName + '的规格')
@@ -713,24 +712,28 @@ layout("/mobile/platform.html"){
if (code === 0) {
this.getUserSelection(this.projectId)
// 女性健康知识讲座福利品Id
if (this.projectId === '8799d66b0bb640078f50feb029e506ed') {
// if (this.projectId === '8799d66b0bb640078f50feb029e506ed') {
pjaxReplace('/mobile/welfare/list/receive_success?projectId=' + this.projectId + '&provideMode=' + this.projectInfo.provideMode)
} else {
vant.Dialog.alert({
title: '温馨提示',
message: "您已完成本次选择。",
}).then(async () => {
this.confirmPopup = false
await this.getProjectInfo()
window.location.reload()
});
}
// } else {
// vant.Dialog.alert({
// title: '温馨提示',
// message: "您已完成本次选择。",
// }).then(async () => {
// this.confirmPopup = false
// await this.getProjectInfo()
// window.location.reload()
// });
// }
// this.$modal.msgSuccess("您已完成本次福利选择。")
} else {
this.$modal.msgError(msg)
this.confirmPopup = false
await this.getProjectInfo()
window.location.reload()
vant.Dialog.alert({
title: '温馨提示',
message: msg,
})
// this.$modal.msgError(msg)
// this.confirmPopup = false
// await this.getProjectInfo()
// window.location.reload()
}
},
@@ -833,6 +836,11 @@ layout("/mobile/platform.html"){
window.sessionStorage.removeItem('welfareProjectSelectInfo' + loginname)
// this.selectAddressPopup = true
} else {
const flag = localStorage.getItem("reload")
if (flag) {
window.location.reload()
localStorage.removeItem("reload")
}
this.getProjectInfo()
}
},
@@ -23,7 +23,7 @@ layout("/mobile/platform.html"){
<path d="M955.330366 240.548613h-83.927839a30.723584 30.723584 0 0 0-31.472939 30.161567v1.124034a30.910923 30.910923 0 0 0 30.348906 31.472939H955.330366a30.723584 30.723584 0 0 0 31.2856-30.348906v-1.124033A30.536245 30.536245 0 0 0 955.330366 240.548613z m-72.125487-168.605033a32.222295 32.222295 0 0 0-43.837308 4.121457L786.725333 141.071644a31.285601 31.285601 0 0 0 48.146104 39.903191l52.080221-64.819268a30.536245 30.536245 0 0 0-2.810084-42.900614zM683.126907 0.005433a30.910923 30.910923 0 0 0-31.47294 30.161567v84.864533a30.723584 30.723584 0 0 0 30.348906 31.285601h1.124034a30.536245 30.536245 0 0 0 31.2856-30.161567V31.291033A30.723584 30.723584 0 0 0 684.25094 0.005433z"
fill="#07C160" p-id="3085"></path>
</svg>
<div style="margin-top: 20px;">{{code=='2' ? '您已领取' : '您已选择'}}</div>
<div style="margin-top: 20px;">{{code=='2' ? '您已领取' : '您已完成本次选择'}}</div>
<div style="margin: 20px auto 0px auto;width: 300px;word-break: break-all">
<!-- 女性健康知识讲座福利品Id -->
{{ projectId == '8799d66b0bb640078f50feb029e506ed' ? '纪念品' : '福利品' }} {{selectOptionNames}}
@@ -55,6 +55,7 @@ layout("/mobile/platform.html"){
},
back() {
pjaxReplace('/mobile/welfare/list/receive?projectId=' + this.projectId)
localStorage.setItem("reload", '1')
}
},
created() {
@@ -297,7 +297,6 @@
tissueId: row.id
})
debugger
this.leftData = data.map((user) => {
return this.getTransProp(user, row.signUpMethod)
})
@@ -106,7 +106,6 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-col>
</el-row>-->
<el-row :gutter="20" v-if="formData.activity_id != null && formData.activity_id !== ''">
@@ -217,13 +217,6 @@ layout("/layouts/platform.html"){
sex: [{required: false, message: "必填", trigger: ["change", "blur"]}],
isVoluntary: [{required: true, message: "必填", trigger: ["change", "blur"]}],
sign: [{required: true, message: "必填", trigger: ["change", "blur"]}],
phone: [
{
validator: (rule, value, callback) => {
},
trigger: ["change", "blur"]
}
],
email: [
{
validator: (rule, value, callback) => {
@@ -37,6 +37,24 @@ layout("/layouts/platform.html"){
</el-radio-group>
</el-form-item>
<el-form-item label="开始撰写时间" prop="startWriteTime">
<el-date-picker
v-model="formData.startWriteTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="开始撰写时间">
</el-date-picker>
</el-form-item>
<el-form-item label="结束撰写时间" prop="endWriteTime">
<el-date-picker
v-model="formData.endWriteTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="结束撰写时间">
</el-date-picker>
</el-form-item>
<el-form-item label="超时自动提交天数" prop="timeoutDays">
<el-input v-model="formData.timeoutDays" oninput="value=value.replace(/[^\d]/g,'')"
placeholder="协办单位超时自动提交天数" maxlength="3"></el-input>
@@ -324,4 +342,4 @@ layout("/layouts/platform.html"){
</script>
<!--#
}
#-->
#-->
@@ -123,7 +123,7 @@ layout("/layouts/platform.html"){
<sign :qz.sync="formData.sign" prefix="proposal"></sign>
</el-form-item>
<el-form-item>
<el-form-item v-if="showWrite">
<el-row justify="center" type="flex">
<el-button @click="doAdd" type="primary" v-throttle>保存到我的提案</el-button>
<el-button @click="openSeconded" type="primary" v-if="formData.mannerCode=='W01'">邀请附议人
@@ -204,7 +204,9 @@ layout("/layouts/platform.html"){
isSign: () => {
return proposal.needSignState.map(v => v.stateCode).includes(proposal.UNSUBMIT)
},
writeRemindDialog: false
writeRemindDialog: false,
showWrite: true,
}
},
methods: {
@@ -390,18 +392,35 @@ layout("/layouts/platform.html"){
this.getInstitutions(this.pageForm.teacherMeetingId)
])
this.config = config;
this.typeOptions = typeOptions;
this.allMannerList = allMannerList;
this.delegationOptions = delegationOptions;
this.committeeOptions = institutions;
this.createMannerList()
const id = GetQueryString("proposalId")
if (id) {
await this.editProposal()
const {startWriteTime, endWriteTime} = this.config
if (moment().isBefore(moment(startWriteTime))) {
this.showWrite = false
this.writeRemindDialog = false
this.$alert('提案征集开始时间为' + startWriteTime, '提示', {
confirmButtonText: '确定'
})
} else if (moment().isAfter(moment(endWriteTime))) {
debugger
this.showWrite = false
this.writeRemindDialog = false
this.$alert('提案征集已经结束', '提示', {
confirmButtonText: '确定',
})
} else {
this.newWriteProposal()
this.typeOptions = typeOptions;
this.allMannerList = allMannerList;
this.delegationOptions = delegationOptions;
this.committeeOptions = institutions;
this.createMannerList()
const id = GetQueryString("proposalId")
if (id) {
await this.editProposal()
} else {
this.newWriteProposal()
}
}
},
},
@@ -1138,7 +1138,6 @@ layout("/layouts/platform.html"){
},
methods: {
openCakeDesc({$index}) {
debugger
this.cake_subject_option_index = $index
this.cakeDialog = true
this.$nextTick(() => {
@@ -172,7 +172,7 @@ layout("/layouts/platform.html"){
const url = "/platform/sourcechange/manage/doBatchChange"
let isSendMsg = false
const isHasNewTeacher = this.checkUsers.some(v=> v.changeInfosStr === '新入职')
const isHasNewTeacher = this.checkUsers.some(v=> v.changeInfosStr === '新入职' && !v.personType.includes('劳务派遣'))
const ids = this.checkUsers.map(item => item.id)
if (isHasNewTeacher) {
this.$confirm('勾选用户中有新入职教工,是否对新入职教职工发送入会邀请?', '提示', {
@@ -197,7 +197,7 @@ layout("/layouts/platform.html"){
async doSubmit(formData){
const url = "/platform/sourcechange/manage/doSubmit"
let isSendMsg = false;
if (formData.changeInfosStr === '新入职') {
if (formData.changeInfosStr === '新入职' && !formData.personType.includes('劳务派遣')) {
this.$confirm('该职工是新入职职工,是否发送入会邀请?', '提示', {
confirmButtonText: '是',
cancelButtonText: '否',
@@ -260,6 +260,7 @@ layout("/layouts/platform.html"){
margin: 10px auto;
overflow: hidden;
box-sizing: border-box;
overflow-y: auto;
}
.layout-grid-container .grid-item {
color: white;
@@ -0,0 +1,372 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.top_block {
width: 100%;
padding: 20px 80px;
border-bottom: 10px solid rgb(240, 240, 240);
}
.top_title {
font-size: 18px;
height: 30px;
line-height: 30px;
margin-bottom: 5px;
}
.top_num {
font-size: 26px;
color: #808492;
}
.two_num {
margin-top: 8px;
font-size: 18px;
color: #808492;
}
.cut-off-line {
width: 1px;
height: 70%;
position: absolute;
right: 0;
top: 0;
bottom: 0;
margin: auto;
background-color: rgb(230, 230, 230);
}
.chartTitle {
font-size: 14px;
color: #808492;
margin-bottom: 20px;
}
</style>
<div id="app">
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度</div>
<div class="search-item-option">
<el-date-picker
style="width: 100%"
@change="doSearch"
:clearable="false"
value-format="yyyy"
v-model="pageForm.year"
type="year"
placeholder="选择年">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">线路类型</div>
<div class="search-item-option">
<el-select v-model="pageForm.lineType" placeholder="线路类型" clearable style="width: 100%">
<el-option v-for="item in regionalNatureList" :key="item.value" :label="item.label" :value="item.value">{{item.label}}</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button type="primary" icon="el-icon-search" @click="doSearch()">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<div class="top_block">
<el-row :gutter="20">
<el-col :span="4" style="position: relative">
<div class="top_title">总人数</div>
<div class="top_num">{{numData.allNum || '0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="4" style="position: relative">
<div class="top_title">省内人数</div>
<div class="top_num">{{numData.provinceNum || '0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="4" style="position: relative">
<div class="top_title">省外人数</div>
<div class="top_num">{{numData.outProvinceNum || '0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="4" style="position: relative">
<div style="display: flex;justify-content: space-between;">
<div class="top_title">总线路数</div>
<div style="margin-top: 2px;font-size: 18px;color: #1867b0">共{{numData.lineNum || '0'}}条</div>
</div>
<div class="two_num">省内{{numData.inLineNum || '0'}} | 省外{{numData.outLineNum || '0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="4" style="position: relative">
<div style="display: flex;justify-content: space-between;">
<div class="top_title">校工会组织</div>
<div style="margin-top: 2px;font-size: 18px;color: #1867b0">共{{numData.schoolUnionLineNum || '0'}}条</div>
</div>
<div class="two_num">省内{{numData.schoolInLineNum || '0'}} | 省外{{numData.schoolOutLineNum || '0'}}</div>
<div class="cut-off-line"></div>
</el-col>
<el-col :span="4">
<div style="display: flex;justify-content: space-between;">
<div class="top_title">分工会组织</div>
<div style="margin-top: 2px;font-size: 18px;color: #1867b0">共{{numData.unionLineNum || '0'}}条</div>
</div>
<div class="two_num">省内{{numData.unionInLineNum || '0'}} | 省外{{numData.unionOutLineNum || '0'}}</div>
</el-col>
</el-row>
</div>
<el-row gutter="20" style="padding: 30px 0;border-bottom: 10px solid rgb(240, 240, 240)">
<el-col :span="12" v-loading="lotLoading">
<div class="chartTitle">时间标段统计</div>
<div id="lotChart" style="width: 100%;height: 300px"></div>
</el-col>
<el-col :span="12" v-loading="ageLoading">
<div class="chartTitle">年龄分布统计</div>
<div id="ageChart" style="width: 100%;height: 300px"></div>
</el-col>
</el-row>
<el-row style="padding: 30px 0;border-bottom: 10px solid rgb(240, 240, 240)">
<el-col :span="24" style="padding: 0 20px" v-loading="lineTravelOrAgeLoading">
<div class="chartTitle">线路人数及年龄统计</div>
<div id="lineTravelChart"></div>
</el-col>
</el-row>
<!-- <el-row style="padding: 30px 0;border-bottom: 10px solid rgb(240, 240, 240)">-->
<!-- <el-col :span="24" style="padding: 0 20px">-->
<!-- <div class="chartTitle">线路出行年龄统计</div>-->
<!-- </el-col>-->
<!-- </el-row>-->
</el-card>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return{
pageForm: {
year: moment().format('YYYY') + "",
lineType: ''
},
numData: {
allNum: '',
provinceNum: '',
outProvinceNum: '',
allLineNum: '',
schoolLineNum: '',
branchLineNum: ''
},
regionalNatureList: [{label:'全部线路',name:'provinceAll',ordinal:0,provinceIn:'provinceIn',provinceOut:'provinceOut',value:'全部'}],
lotLoading: false,
ageLoading: false,
lineTravelOrAgeLoading: false,
isLineTravel: false,
lineTravelOrAgeTip: '出行线路年龄统计',
dualAxisChartInstance: null,
chartData: [
{ "lineName": "03-15", "takePartInLineNum": 10, "underThirtyFive": 5, "thirtyFiveToFortyFive": 3, "aboveFortyFive": 2 },
{ "lineName": "04-10", "takePartInLineNum": 15, "underThirtyFive": 7, "thirtyFiveToFortyFive": 6, "aboveFortyFive": 2 }
]
}
},
methods: {
async getNumData(){
const resp = await $.post('/platform/theRapyRecuperation/annualAnalysis/getNumData', this.pageForm)
if (resp.code === 0) {
this.numData = resp.data
}
},
async getLotNumData(){
this.lotLoading = true
const resp = await $.post('/platform/theRapyRecuperation/annualAnalysis/getLotNum', this.pageForm)
if (resp.code === 0) {
let {data} = resp
document.getElementById("lotChart").innerHTML = ''
const config = {
isStack: true,
"legend": {
"position": "top-right",
"flipPage": false
},
autoFit: true,
title: {
visible: true,
text: '出行时间标段统计详情',
},
description: {
visible: true,
text: '人',
},
xField: 'label',
yField: 'value',
stackField: 'type',
color: ["#5B8FF9", "#5AD8A6"],
"xAxis": {
label: {
formatter: (v) => {
if (data.length > 30 && v.length > 3) {
return v.substr(0, 2) + '...'
} else if (data.length > 20 && v.length > 4) {
return v.substr(0, 3) + '...'
} else if (data.length > 10 && v.length > 6) {
return v.substr(0, 5) + '...'
}
return v
}
}
},
"yAxis": {},
meta: {
label: {
alias: '标段时长',
},
value: {
alias: '人数',
}
},
connectedArea: {
visible: true,
triggerOn: false,
},
}
const plot = new G2Plot.Column(document.getElementById("lotChart"), {
data,
...config,
});
plot.render();
this.lotLoading = false
}
},
async getAgeData(){
this.ageLoading = true
const resp = await $.post('/platform/theRapyRecuperation/annualAnalysis/getAgeNum', this.pageForm)
if (resp.code === 0) {
let {data} = resp
document.getElementById("ageChart").innerHTML = ''
const config = {
"legend": {
"flipPage": false
},
"label": {
"type": "spider",
"offset": 50
},
"width": $('#ageChart').width(),
"height": $('#ageChart').height(),
"forceFit": false,
"radius": 1,
"colorField": "label",
"angleField": "value",
meta: {
label: {
alias: '年龄结构',
},
value: {
alias: '人数',
}
},
}
const plot = new G2Plot.Pie(document.getElementById("ageChart"), {
data,
...config,
});
plot.render();
this.ageLoading = false
}
},
async getLineTravelData(){
if (this.dualAxisChartInstance) {
this.dualAxisChartInstance.destroy(); // 如果已有实例,先销毁
}
const resp = await $.post('/platform/theRapyRecuperation/annualAnalysis/getLineTravelAndAgeData', this.pageForm)
if (resp.code === 0) {
let {data} = resp
document.getElementById("lineTravelChart").innerHTML = ''
const dualAxes = new G2Plot.DualAxes('lineTravelChart', {
data: [data.uvData, data.transformData],
xField: 'lineName',
yField: ['value', 'count'],
meta: {
value: {
alias: '出行人数',
},
count: {
alias: '年龄段人数',
}
},
yAxis: [
{
min: 0, // 设置Y轴最小值为0
max: null, // 自动计算最大值
title: {
text: '出行人数',
},
},
{
position: 'right',
min: 0,
max: null,
title: {
text: '年龄段人数',
},
},
],
geometryOptions: [
{
geometry: 'column',
columnWidthRatio: 0.4,
color: '#5B8FF9', // 设置柱状图颜色
},
{
geometry: 'line',
seriesField: 'name',
color: ['#5AD8A6', '#E8684A', '#FF9D4D'], // 设置线的颜色
},
],
tooltip: {
shared: true, // 共享提示框
},
});
dualAxes.render();
}
},
doLineTravelOrAgeSwitch(){
this.isLineTravel = !this.isLineTravel
this.lineTravelOrAgeTip = this.isLineTravel ? '出行线路年龄统计' : '出行线路人数统计'
},
async pageData(){
await this.getNumData()
await this.getLotNumData()
await this.getAgeData()
await this.getLineTravelData()
}
},
async created() {
this.regionalNatureList.push(...await getEnumOptions('TheRapyRecuperationProvinceType'))
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -140,11 +140,12 @@ layout("/layouts/platform.html"){
<span>选择路线:</span>
<el-select v-model="pageForm.takePartInLineId" filterable clearable
placeholder="请选择线路"
style="width: 80%" @change="doSearch()">
style="width: 80%"
@change="lineChange(pageForm.takePartInLineId);doSearch()">
<el-option v-for="item in takePartInLines"
:key="item.id"
:key="item.selectId"
:label="item.lineName"
:value="item.id">
:value="item.selectId">
</el-option>
</el-select>
</el-col>
@@ -169,6 +170,20 @@ layout("/layouts/platform.html"){
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<span>出行时间:</span>
<el-select v-model="pageForm.selectId" filterable clearable
placeholder="请选择出行时间"
style="width: 80%" @change="doSearch()">
<el-option v-for="item in linePlayTimes"
:key="item.times"
:label="item.times"
:value="item.selectId">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
@@ -192,7 +207,7 @@ layout("/layouts/platform.html"){
v-for="item in options">
{{ item.label }}
</el-tag>
<el-link :underline="false" @click="pageForm.state='';doSearch()" class="mr10"
<el-link :underline="false" @click="clearState" class="mr10"
style="color: red" v-if="options.length&&pageForm.state">清空
</el-link>
<template
@@ -244,7 +259,12 @@ layout("/layouts/platform.html"){
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='isFamily'">
{{row.isFamily?'携带':'未携带'}}{{row.num}}
<el-link v-if="!row.familyNumber" type="primary" @click="openUser(row)">
{{row.isFamily?'携带':'未携带'}}{{row.isFamily}}
</el-link>
<el-link v-else type="primary">
{{row.familyNumber?'携带':'未携带'}}{{row.familyNumber}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='num'">
{{1+row.num}}
@@ -256,9 +276,39 @@ layout("/layouts/platform.html"){
<sapn v-else style="color: #67C23A">暂无</sapn>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="300px">
<el-table-column align="center" header-align="center" label="操作" width="180px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<template v-if="!pageForm.regionalNature
||(pageForm.regionalNature==='省内'&&modifyConfig.isSnLine)
||(pageForm.regionalNature==='省外'&&modifyConfig.isSwLine)">
<el-dropdown-item v-if="ifRecall(row)" :command="{type:'recall',data:row}">
撤回
</el-dropdown-item>
<el-dropdown-item v-if="ifEdit(row)" :command="{type:'handle',data:row}">
审核
</el-dropdown-item>
<template v-if="[2750].includes(row.stateId)">
<el-dropdown-item :command="{type:'modify',data:row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}">
删除
</el-dropdown-item>
</template>
</template>
</el-dropdown-menu>
</el-dropdown>
<!--<el-button @click="openView(row)" size="mini" type="primary">查看
</el-button>
<template v-if="!pageForm.regionalNature||
(pageForm.regionalNature==='省内'&&modifyConfig.isSnLine)||
@@ -270,8 +320,7 @@ layout("/layouts/platform.html"){
type="primary">
审核
</el-button>
</template>
</template>-->
</template>
</el-table-column>
</el-table>
@@ -303,17 +352,24 @@ layout("/layouts/platform.html"){
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row style="margin: 40px 0;text-align: right">
<el-button @click="doAudit(false)" type="danger">退
<el-button @click="$refs.guava.index()">
</el-button>
<el-button @click="doAudit(true)" type="primary">通过
<el-button @click="doAudit(false,true)" type="warning">调整
</el-button>
<el-button @click="doAudit(false,false)" type="danger">拒绝
</el-button>
<el-button @click="doAudit(true,false)" type="primary">通过
</el-button>
</el-row>
</el-form>
@@ -330,7 +386,7 @@ layout("/layouts/platform.html"){
width="50%">
<el-form :model="formData" label-width="130px">
<el-row gutter="20">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
@@ -341,20 +397,150 @@ layout("/layouts/platform.html"){
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="doOnekeyAudit(false)">取 消</el-button>
<el-button type="primary" @click="doOnekeyAudit(true)">确 定</el-button>
</span>
<el-button @click="dialogVisible = false">返 回</el-button>
<el-button @click="doOnekeyAudit(false,true)" type="warning">调 整</el-button>
<el-button @click="doOnekeyAudit(false,false)" type="danger">拒 绝</el-button>
<el-button type="primary" @click="doOnekeyAudit(true,false)">通 过</el-button>
</span>
</el-dialog>
<el-dialog
title="修改信息"
:visible.sync="editVisible"
:close-on-click-modal="false"
width="50%">
<el-form :model="editFormData" label-width="120px" :rules="rules" ref="editForm" style="margin-right: 40px">
<el-row>
<el-col span="12">
<el-form-item prop="loginName" label="工号">
<el-input v-model="editFormData.loginName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="姓名">
<el-input v-model="editFormData.userName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="userName" label="手机号">
<el-input v-model="editFormData.mobile" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="身份证号">
<el-input v-model="editFormData.idCard" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="unionName" label="工会">
<el-input v-model="editFormData.unionName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="unitName" label="单位">
<el-input v-model="editFormData.unitName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="prop" :label="labelName">
<template v-if="modifyConfig.familyInfo == 2">
<el-collapse v-model="activeNames">
<el-collapse-item title="点击可展开详细信息" name="1">
<el-card shadow="never">
<el-table :data="editFormData.companionList">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="身份证号" prop="idCard"></el-table-column>
<el-table-column label="年龄" prop="age"></el-table-column>
<el-table-column label="床型" prop="bedType">
<template scope="{row}">
{{ row.bedInfo.bedType }}
</template>
</el-table-column>
<el-table-column label="床位" prop="bedNum">
<template scope="{row}">
{{ row.bedInfo.bedNum }}
</template>
</el-table-column>
<el-table-column label="意向拼床人" prop="otherSleepUser">
<template scope="{row}">
{{ row.bedInfo.otherSleepUser ?
row.bedInfo.otherSleepUser : '暂无' }}
</template>
</el-table-column>
<el-table-column label="关系" prop="relation"></el-table-column>
</el-table>
</el-card>
</el-collapse-item>
</el-collapse>
</template>
<template v-else>
<el-input v-model="editFormData.bedType" readonly></el-input>
</template>
</el-form-item>
<!--<el-form-item prop="travelName" label="旅行社">
<el-select v-model="editFormData.agencyId" filterable clearable
placeholder="请选择旅行社"
style="width: 100%">
<el-option v-for="item in agencyLists"
:key="item.id"
:label="item.travelAgencyName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>-->
<el-form-item prop="travelLine" :label="lineLabelName">
<el-select v-model="editFormData.takePartInLineId" filterable clearable
placeholder="请选择线路"
@change="validateLine"
style="width: 100%">
<el-option v-for="item in unionSelectLines"
:key="item.id"
:label="item.lineName + '-' + item.regionalNature + '【' + item.lotName + '】' + '' + item.playStartTime + '至' + item.playEndTime + '' + '' + item.signUpMode + ''"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="specificTime" label="出行时间" v-if="pageForm.state==='3'">
<el-select v-model="editFormData.specificTime" filterable clearable
placeholder="请选择出行时间"
style="width: 100%">
<el-option v-for="item in editSpecificTimes"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
@@ -378,8 +564,9 @@ layout("/layouts/platform.html"){
isTransferIn: false,
},
options: [
{label: "总人数", value: "0"},
{label: "本工会人员(自己线路)", value: "1"},
{label: "本工会人员(其他路线)", value: "2"},
// {label: "本工会人员(其他路线)", value: "2"},
{label: "其他工会人员(选我线路)", value: "3"}
],
unionOptions: [],
@@ -403,20 +590,151 @@ layout("/layouts/platform.html"){
// {prop: 'userNature', label: '人员性质'},
{prop: 'isFamily', label: '是否携带家属'},
// {prop: 'num', label: '人数'},
{prop: 'isTransferIn', label: '是否转入转出', sortable: true},
// {prop: 'isTransferIn', label: '是否转入转出', sortable: true},
{prop: 'linePlayTime', label: '出行时间', sortable: true},
{prop: 'stateId', label: '审核状态', sortable: true},
],
modifyConfig: {}
modifyConfig: {},
linePlayTimes: [],
editVisible: false,
editFormData: {
companionList: []
},
rules: {
loginName: [{required: true, message: '请填写工号', trigger: ['blur', 'change']}],
userName: [{required: true, message: '请填写姓名', trigger: ['blur', 'change']}],
unionName: [{required: true, message: '请选择工会', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '请选择单位', trigger: ['blur', 'change']}],
// travelName: [{required: true, message: '请选择旅行社', trigger: ['blur', 'change']}],
specificTime: [{required: true, message: '请选择出行时间', trigger: ['blur', 'change']}],
// travelLine: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
editSpecificTimes: [],
labelName: '',
unionSelectLines: [],
lineLabelName: '',
activeNames:[],
}
},
components: {
'enroll-info': httpVueLoader('/components/theRapyRecuperation/Enrollinfo.vue'),
'enroll-info': httpVueLoader('/components/theRapyRecuperation/Enrollinfo.vue?v=1.0.1'),
'line-info': httpVueLoader('/components/theRapyRecuperation/LineInfo.vue')
},
methods: {
async doOnekeyAudit(flag) {
const confirm = await this.$confirm('您确定要一键审核您所勾选的信息吗, 是否继续?', '提示', {
async validateLine() {
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/validSignUpInfo'
, {enroll: JSON.stringify(this.editFormData)})
if (resp.code !== 0) {
this.$message.warning(resp.msg)
this.editFormData.takePartInLineId = ''
}
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'recall') {
this.doRecall(data)
} else if (type === 'handle') {
this.openEdit(data)
} else if (type === 'modify') {
this.openModify(data)
} else if (type === 'delete') {
this.doDelete(data)
}
},
async doDelete(row) {
this.$confirm("您确定要删除【<span style='color: red'>" + row.userName + "</span>】的此条报名信息吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
dangerouslyUseHTMLString: true,
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/doDeleteMyEnrollInfoById/' + row.id)
if (resp.code === 0) {
await this.doSearch()
this.$message.success('删除成功')
await this.getApplyNumAudit();
} else {
this.$message.warning(resp.msg)
}
}
}
})
},
async openModify(row) {
this.editFormData = {};
const resp = await $.get("/platform/theRapyRecuperation/TheRapyAudit/findOne", {id: row.id})
if (resp.code === 0) {
this.editFormData = {...resp.data.viewData}
if (this.modifyConfig.familyInfo == 2) {
this.editFormData.companionList = resp.data.viewData.companionList
this.labelName = "家属信息"
} else {
this.editFormData.bedType = resp.data.viewData.familyNumber
this.labelName = "家属数量"
}
}
if (row.takePartInBaseManagementId) {
this.editSpecificTime(row.takePartInBaseManagementId);
this.lineLabelName = "酒店"
} else if (row.takePartInLineId) {
this.lineLabelName = '线路'
}
this.editVisible = true
},
async doEdit() {
this.$refs['editForm'].validate().then(async () => {
const confirm = await this.$confirm('您确定要修改这位老师的报名信息吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
if (!this.editFormData.takePartInLineId && !this.editFormData.takePartInBaseManagementId) {
this.$message.warning('请选择线路')
return
}
const resp = await $.post('/platform/theRapyRecuperation/user/query/doEdit', this.editFormData)
if (resp.code === 0) {
this.$notify.success(resp.msg)
this.editVisible = false
await this.doSearch();
} else {
this.$notify.error(resp.msg)
}
}
})
},
async lineChange(val) {
this.pageForm.selectId = '';
const data = this.takePartInLines.find(v => v.selectId === val)
if (!data) {
return
}
const resp = await $.get('/platform/theRapyRecuperation/TheRapyXghAudit/getLinePlayTimeByLineId', {
lineId: data.id,
year: this.pageForm.year,
signUpMode: 1,
})
if (resp.code === 0) {
this.linePlayTimes = resp.data
}
},
async doOnekeyAudit(flag, adjustment) {
let msg = '';
if (adjustment && !flag) {
msg = '您确定要一键【调整】您所勾选的报名信息吗,调整后该报名信息将不会在审核列表中展示, 是否继续?'
} else if (!adjustment && !flag) {
msg = '您确定要一键【拒绝】您所勾选的报名信息吗,是否继续?'
} else if (!adjustment && flag) {
msg = '您确定要一键【通过】您所勾选的报名信息吗,是否继续?'
}
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
@@ -425,13 +743,14 @@ layout("/layouts/platform.html"){
const resp = await $.post(loc() + "/doOnekeyAudit", {
ids: JSON.stringify(this.tableSelection),
flag: flag,
adjustment: adjustment,
auditOpinion: this.formData.auditOpinion
})
if (resp.data===0){
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
await this.doSearch()
this.dialogVisible = false
}else {
} else {
this.$notify.warning({title: '失败', message: resp.msg});
this.dialogVisible = false
}
@@ -468,7 +787,8 @@ layout("/layouts/platform.html"){
selfUnionId,
takePartInUnionId
} = row
if ((stateId === 2715 || stateId === 2720 || stateId === 2750) && selfUnionId === "${@shiro.getPrincipalProperty('unit').getUnionid()}") {
// if ((stateId === 2715 || stateId === 2720 || stateId === 2750) && selfUnionId === "${@shiro.getPrincipalProperty('unit').getUnionid()}") {
if ((stateId === 2715 || stateId === 2750) && selfUnionId === "${@shiro.getPrincipalProperty('unit').getUnionid()}") {
return true
} else if ((stateId === 2725 || stateId === 2750) && takePartInUnionId === "${@shiro.getPrincipalProperty('unit').getUnionid()}") {
return true
@@ -484,16 +804,24 @@ layout("/layouts/platform.html"){
})
if (confirm === "confirm") {
const resp = await $.post(loc() + "/doRecall", {id: row.id})
if (resp.code === 0){
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
await this.doSearch()
}else {
} else {
this.$notify.warning({title: '失败', message: resp.msg});
}
}
},
async doAudit(flag) {
const confirm = await this.$confirm('您确定要' + (flag ? '通过' : '退回') + '吗, 是否继续?', '提示', {
async doAudit(flag, adjustment) {
let msg = '';
if (adjustment && !flag) {
msg = '您确定要【调整】该报名信息吗,调整后该报名信息将不会在审核列表中展示, 是否继续?'
} else if (!adjustment && !flag) {
msg = '您确定要【拒绝】该报名信息吗,是否继续?'
} else if (!adjustment && flag) {
msg = '您确定要【通过】该报名信息吗,是否继续?'
}
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
@@ -501,15 +829,16 @@ layout("/layouts/platform.html"){
if (confirm === "confirm") {
const resp = await $.post(loc() + "/doAudit", {
flag: flag,
adjustment: adjustment,
id: this.formData.id,
isTransferIn: this.formData.isTransferIn,
auditOpinion: this.formData.auditOpinion
})
if (resp.code === 0){
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.doSearch()
this.$refs.guava.index()
}else {
} else {
this.$notify.warning({title: '失败', message: resp.msg});
}
}
@@ -568,7 +897,7 @@ layout("/layouts/platform.html"){
this.unionOptions = data
},
async getXlByUnion() {
const {data} = await $.post(loc() + "/getXlByUnion", {
const {data} = await $.post(loc() + "/getXlByUnionAudit", {
unionId: this.pageForm.unionId,
year: this.pageForm.year,
regionalNature: this.pageForm.regionalNature,
@@ -597,12 +926,18 @@ layout("/layouts/platform.html"){
async getApplyNumAudit() {
const {data} = await $.post(loc() + "/getApplyNumAudit", this.pageForm)
this.options = [
{label: "总人数" + (data.count1 + data.count3) + "人", value: "0"},
{label: "本工会人员(自己线路)" + data.count1 + "人", value: "1"},
{label: "本工会人员(其他路线)" + data.count2 + "人", value: "2"},
// {label: "本工会人员(其他路线)" + data.count2 + "人", value: "2"},
{label: "其他工会人员(选我线路)" + data.count3 + "人", value: "3"}
]
},
async clearState() {
this.pageForm.state = ''
this.pageForm.unionId = ''
await this.doSearch()
},
async doSearch() {
this.pageForm.pageNumber = 1;
this.pageData();
@@ -615,12 +950,22 @@ layout("/layouts/platform.html"){
this.modifyConfig = res.data
}
},
async getUnionSelectLine() {
const resp = await $.post('/platform/theRapyRecuperation/user/query/getUnionSelectLine', {
year: this.pageForm.year,
signUpMode: 1,
})
if (resp.code === 0) {
this.unionSelectLines = resp.data
}
},
},
async created() {
await this.getBmUserUnion()
await this.getModifyConfig()
this.takePartInLines = await this.getXlByUnion()
await this.doSearch()
await this.getUnionSelectLine()
}
})
</script>
@@ -0,0 +1,806 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style xmlns="">
.query-row {
height: 70px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row .el-col {
overflow: hidden;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
.el-table-container {
padding-top: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title"></el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="12">
<span>&emsp;&emsp;度:</span>
<el-date-picker
v-model="pageForm.year"
type="year"
value-format="yyyy"
placeholder="选择年"
style="width: 80%" @change="doSearch">
</el-date-picker>
</el-col>
<el-col :span="12">
<span>查询类型:</span>
<el-input placeholder="请输入内容" clearable
v-model="pageForm.searchKeyword"
style="width: 80%" @keyup.enter.native="doSearch">
<el-select v-model="pageForm.searchName" slot="prepend"
placeholder="查询类型"
style="width: 110px;">
<el-option label="姓名" value="userName"></el-option>
<el-option label="工号" value="loginName"></el-option>
</el-select>
<el-button slot="append" @click="doSearch">搜索</el-button>
</el-input>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title"></el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="12">
<span>所属工会:</span>
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会"
@change="unionChange"
filterable clearable style="width: 80%"
:disabled="unionDisabled">
<el-option
v-for="item in unionOptions"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<span>所属单位:</span>
<el-select v-model="pageForm.unitId" placeholder="请选择所属单位"
@change="doSearch"
filterable clearable style="width: 80%"
:disabled="unitDisabled">
<el-option
v-for="item in unitOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title"></el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="12">
<span>&ensp;&ensp;社:</span>
<el-select v-model="pageForm.agencyId" filterable clearable
placeholder="请选择旅行社"
style="width: 80%">
<el-option v-for="item in agencyLists"
:key="item.id"
:label="item.travelAgencyName"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="审核列表" :app="this">
<template #label_end>
</template>
<template #func>
<el-tag :effect="pageForm.state===item.value?'dark':'plain'"
:key="item.value"
:type="item.label"
@click="checkState(item.value)"
style="margin-right: 10px;cursor: pointer;font-size: 15px"
v-for="item in options">
{{ item.label }}
</el-tag>
<el-link :underline="false" @click="clearState" class="mr10"
style="color: red" v-if="options.length&&pageForm.state">清空
</el-link>
<template v-if="modifyConfig.travelAudit">
<el-button type="primary" size="small" class="mr10"
@click="openOnekeyAudit">一键审核
</el-button>
<el-radio-group @change="doSearch()" size="small"
v-model="pageForm.isAudit">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button label="true">已审核</el-radio-button>
<el-radio-button label="false">未审核</el-radio-button>
</el-radio-group>
</template>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%"
row-key="id" @sort-change="pageOrder"
v-loading="tableLoading"
@selection-change="handleSelectionChange">
<el-table-column
:selectable="ifEdit"
type="selection"
width="55">
</el-table-column>
<el-table-column align="center" header-align="center" type="index"
:index="indexMethod" label="序号"
width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template scope="{row}" v-if="column.prop=='isTransferIn'">
<sapn v-if="row.takePartInUnionId!=unionId">转出</sapn>
<sapn v-else-if="row.selfUnionId!=unionId">转入</sapn>
<sapn v-else></sapn>
</template>
<template scope="{row}" v-else-if="column.prop=='isFamily'">
<el-link v-if="!row.familyNumber" type="primary" @click="openUser(row)">
{{row.isFamily?'携带':'未携带'}}{{row.isFamily}}
</el-link>
<el-link v-else type="primary">
{{row.familyNumber?'携带':'未携带'}}{{row.familyNumber}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='num'">
{{1+row.num}}
</template>
<template scope="{row}" v-else-if="column.prop=='stateId'">
<span v-if="row.stateId">
<vi-table-state :state="row"></vi-table-state>
</span>
<sapn v-else style="color: #67C23A">暂无</sapn>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="180px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<template v-if="modifyConfig.travelAudit">
<el-dropdown-item v-if="ifRecall(row)" :command="{type:'recall',data:row}">
撤回
</el-dropdown-item>
<el-dropdown-item v-if="ifEdit(row)" :command="{type:'handle',data:row}">
审核
</el-dropdown-item>
<template v-if="[2750].includes(row.stateId)">
<el-dropdown-item :command="{type:'modify',data:row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}">
删除
</el-dropdown-item>
</template>
</template>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #view>
<enroll-info ref="viewEnrollInfo" :union_id="unionId"></enroll-info>
</template>
<template #public>
<line-info ref="viewLineInfo"></line-info>
</template>
<template #edit>
<enroll-info ref="editEnrollInfo">
<template #handle>
<el-tab-pane label="审核" name="audit">
<el-form :model="formData" label-width="130px">
<el-row gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row style="margin: 40px 0;text-align: right">
<el-button @click="$refs.guava.index()">返回
</el-button>
<el-button @click="doAudit(false,true)" type="warning">调整
</el-button>
<el-button @click="doAudit(false,false)" type="danger">拒绝
</el-button>
<el-button @click="doAudit(true,false)" type="primary">通过
</el-button>
</el-row>
</el-form>
</el-tab-pane>
</template>
</enroll-info>
</template>
</guava>
<el-dialog
title="提示"
:visible.sync="dialogVisible"
width="50%">
<el-form :model="formData" label-width="130px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="审核人" prop="username">
<el-input disabled v-model="formData.username"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="审核时间" prop="auditTime">
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">返 回</el-button>
<el-button @click="doOnekeyAudit(false,true)" type="warning">调 整</el-button>
<el-button @click="doOnekeyAudit(false,false)" type="danger">拒 绝</el-button>
<el-button type="primary" @click="doOnekeyAudit(true,false)">通 过</el-button>
</span>
</el-dialog>
<el-dialog
title="修改信息"
:visible.sync="editVisible"
:close-on-click-modal="false"
width="50%">
<el-form :model="editFormData" label-width="120px" :rules="rules" ref="editForm" style="margin-right: 40px">
<el-row>
<el-col span="12">
<el-form-item prop="loginName" label="工号">
<el-input v-model="editFormData.loginName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="姓名">
<el-input v-model="editFormData.userName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="userName" label="手机号">
<el-input v-model="editFormData.mobile" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="身份证号">
<el-input v-model="editFormData.idCard" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="unionName" label="工会">
<el-input v-model="editFormData.unionName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="unitName" label="单位">
<el-input v-model="editFormData.unitName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="prop" :label="labelName">
<template v-if="modifyConfig.familyInfo == 2">
<el-collapse v-model="activeNames">
<el-collapse-item title="点击可展开详细信息" name="1">
<el-card shadow="never">
<el-table :data="editFormData.companionList">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="身份证号" prop="idCard" show-overflow-tooltip></el-table-column>
<el-table-column label="年龄" prop="age"></el-table-column>
<el-table-column label="床型" prop="bedType">
<template scope="{row}">
{{ row.bedInfo.bedType }}
</template>
</el-table-column>
<el-table-column label="床位" prop="bedNum">
<template scope="{row}">
{{ row.bedInfo.bedNum }}
</template>
</el-table-column>
<el-table-column label="意向拼床人" prop="otherSleepUser">
<template scope="{row}">
{{ row.bedInfo.otherSleepUser ?
row.bedInfo.otherSleepUser : '暂无' }}
</template>
</el-table-column>
<el-table-column label="关系" prop="relation"></el-table-column>
</el-table>
</el-card>
</el-collapse-item>
</el-collapse>
</template>
<template v-else>
<el-input v-model="editFormData.bedType" readonly></el-input>
</template>
</el-form-item>
<el-form-item prop="travelName" label="旅行社">
<el-select v-model="editFormData.agencyId" filterable clearable
placeholder="请选择旅行社"
style="width: 100%">
<el-option v-for="item in agencyLists"
:key="item.id"
:label="item.travelAgencyName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
unionDisabled: false,
unitDisabled: false,
unionId: "${@shiro.getPrincipalProperty('unit').getUnionid()}",
dialogVisible: false,
tableSelection: [],
formData: {
id: "",
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD HH:mm:ss'),
auditOpinion: "",
isTransferIn: false,
},
options: [
{label: "总人数", value: "0"},
],
unionOptions: [],
unitOptions: [],
takePartInLines: [],
pageForm: {
lotId: '',
regionalNature: '',
isAudit: "",
state: "",
year: moment().format('YYYY'),
searchName: "userName",
},
tableColumns: [
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'unitName', label: '单位', sortable: true},
{prop: 'unionName', label: '工会', sortable: true},
{prop: 'travelAgencyName', label: '旅行社', sortable: true},
{prop: 'isFamily', label: '是否携带家属'},
{prop: 'stateId', label: '审核状态', sortable: true},
],
modifyConfig: {},
editVisible: false,
editFormData: {
companionList: []
},
rules: {
loginName: [{required: true, message: '请填写工号', trigger: ['blur', 'change']}],
userName: [{required: true, message: '请填写姓名', trigger: ['blur', 'change']}],
unionName: [{required: true, message: '请选择工会', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '请选择单位', trigger: ['blur', 'change']}],
travelName: [{required: true, message: '请选择旅行社', trigger: ['blur', 'change']}],
specificTime: [{required: true, message: '请选择出行时间', trigger: ['blur', 'change']}],
},
editSpecificTimes: [],
labelName: '',
unionSelectLines: [],
lineLabelName: '',
activeNames:[],
agencyLists: [],
}
},
components: {
'enroll-info': httpVueLoader('/components/theRapyRecuperation/Enrollinfo.vue?v=1.0.1'),
'line-info': httpVueLoader('/components/theRapyRecuperation/LineInfo.vue')
},
methods: {
async getAgencyList() {
const {data} = await $.post("/platform/theRapyRecuperation/travelAgency/selectTravelAgencyByYears", {
startYear: this.pageForm.startYear,
endYear: this.pageForm.endYear
})
this.agencyLists = data
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'recall') {
this.doRecall(data)
} else if (type === 'handle') {
this.openEdit(data)
} else if (type === 'modify') {
this.openModify(data)
} else if (type === 'delete') {
this.doDelete(data)
}
},
async doDelete(row) {
this.$confirm("您确定要删除【<span style='color: red'>" + row.userName + "</span>】的此条报名信息吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
dangerouslyUseHTMLString: true,
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/doDeleteMyEnrollInfoById/' + row.id)
if (resp.code === 0) {
await this.doSearch()
this.$message.success('删除成功')
await this.getApplyNumAudit();
} else {
this.$message.warning(resp.msg)
}
}
}
})
},
async openModify(row) {
this.editFormData = {};
const resp = await $.get("/platform/theRapyRecuperation/TheRapyAudit/findOne", {id: row.id})
if (resp.code === 0) {
this.editFormData = {...resp.data.viewData}
if (this.modifyConfig.familyInfo == 2) {
this.editFormData.companionList = resp.data.viewData.companionList
this.labelName = "家属信息"
} else {
this.editFormData.bedType = resp.data.viewData.familyNumber
this.labelName = "家属数量"
}
}
if (row.takePartInBaseManagementId) {
this.editSpecificTime(row.takePartInBaseManagementId);
this.lineLabelName = "酒店"
} else if (row.takePartInLineId) {
this.lineLabelName = '线路'
}
this.editVisible = true
},
async doEdit() {
this.$refs['editForm'].validate().then(async () => {
const confirm = await this.$confirm('您确定要修改这位老师的报名信息吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
if (!this.editFormData.takePartInLineId && !this.editFormData.takePartInBaseManagementId) {
this.$message.warning('请选择线路')
return
}
const resp = await $.post('/platform/theRapyRecuperation/user/query/doEdit', this.editFormData)
if (resp.code === 0) {
this.$notify.success(resp.msg)
this.editVisible = false
await this.doSearch();
} else {
this.$notify.error(resp.msg)
}
}
})
},
async doOnekeyAudit(flag, adjustment) {
let msg = '';
if (adjustment && !flag) {
msg = '您确定要一键【调整】您所勾选的报名信息吗,调整后该报名信息将不会在审核列表中展示, 是否继续?'
} else if (!adjustment && !flag) {
msg = '您确定要一键【拒绝】您所勾选的报名信息吗,是否继续?'
} else if (!adjustment && flag) {
msg = '您确定要一键【通过】您所勾选的报名信息吗,是否继续?'
}
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post(loc() + "/doOnekeyAudit", {
ids: JSON.stringify(this.tableSelection),
flag: flag,
adjustment: adjustment,
auditOpinion: this.formData.auditOpinion
})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
await this.doSearch()
this.dialogVisible = false
} else {
this.$notify.warning({title: '失败', message: resp.msg});
this.dialogVisible = false
}
}
},
async openOnekeyAudit() {
if (this.tableSelection.length === 0) {
this.$notify.warning({title: '警告', message: "请您先在左侧勾选在审核"});
return
}
this.dialogVisible = true
},
handleSelectionChange(val) {
this.tableSelection = val.map(v => v.id);
},
ifEdit(row) {
const {
stateId,
selfUnionId,
takePartInUnionId
} = row
if (stateId === 2710 && selfUnionId === "${@shiro.getPrincipalProperty('unit').getUnionid()}") {
return true
} else if (stateId === 2720 && takePartInUnionId === "${@shiro.getPrincipalProperty('unit').getUnionid()}") {
return true
} else {
return false
}
},
ifRecall(row) {
const {
stateId,
selfUnionId,
takePartInUnionId
} = row
// if ((stateId === 2715 || stateId === 2720 || stateId === 2750) && selfUnionId === "${@shiro.getPrincipalProperty('unit').getUnionid()}") {
if ((stateId === 2715 || stateId === 2750) && selfUnionId === "${@shiro.getPrincipalProperty('unit').getUnionid()}") {
return true
} else if ((stateId === 2725 || stateId === 2750) && takePartInUnionId === "${@shiro.getPrincipalProperty('unit').getUnionid()}") {
return true
} else {
return false
}
},
async doRecall(row) {
const confirm = await this.$confirm('您确定要撤回吗, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post(loc() + "/doRecall", {id: row.id})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
await this.doSearch()
} else {
this.$notify.warning({title: '失败', message: resp.msg});
}
}
},
async doAudit(flag, adjustment) {
let msg = '';
if (adjustment && !flag) {
msg = '您确定要【调整】该报名信息吗,调整后该报名信息将不会在审核列表中展示, 是否继续?'
} else if (!adjustment && !flag) {
msg = '您确定要【拒绝】该报名信息吗,是否继续?'
} else if (!adjustment && flag) {
msg = '您确定要【通过】该报名信息吗,是否继续?'
}
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
const resp = await $.post(loc() + "/doAudit", {
flag: flag,
adjustment: adjustment,
id: this.formData.id,
isTransferIn: this.formData.isTransferIn,
auditOpinion: this.formData.auditOpinion
})
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
this.doSearch()
this.$refs.guava.index()
} else {
this.$notify.warning({title: '失败', message: resp.msg});
}
}
},
openEdit(row) {
this.$set(this.formData, "isTransferIn", row.isTransferIn)
this.$set(this.formData, "id", row.id)
this.$refs.guava.edit()
this.$refs.editEnrollInfo.openAudit(row.id, 'audit')
},
openView(row) {
this.$refs.guava.view()
this.$refs.viewEnrollInfo.openView(row.id)
},
async checkState(type) {
this.pageForm.state = type
this.$set(this.pageForm, "unionIds", [])
this.$set(this.pageForm, "unionId", null)
await this.getBmUserUnion()
if (type === "1") {
this.$set(this.pageForm, "unionId", this.unionId)
this.unionDisabled = true
} else if (type === "2") {
this.unionDisabled = true
this.unitDisabled = true
} else if (type === "3") {
this.unionDisabled = false
this.unitDisabled = false
this.unionOptions = this.unionOptions.filter(v => v.id !== this.unionId)
} else {
this.unionDisabled = false
this.unitDisabled = false
}
await this.unionChange()
await this.doSearch()
},
async unionChange() {
this.pageForm.unitId = null
this.unitOptions = await getUnits(this.pageForm.unionId)
await this.doSearch()
},
/**
* 查询所有报名人员的工会
* @returns {Promise<void>}
*/
async getBmUserUnion() {
const {data} = await $.post(loc() + "/getBmUserUnion")
this.unionOptions = data
},
pageData() {
sublime.showLoadingbar();
this.tableLoading = true
const pageForm = clone(this.pageForm)
pageForm.states = JSON.stringify(pageForm.states)
$.post(loc() + "/pageData", pageForm, (data) => {
sublime.closeLoadingbar();
this.tableLoading = false
if (data.code === 0) {
this.tableData = data.data.list;
this.pageForm.totalCount = data.data.totalCount;
} else {
this.$message.error(data.msg);
}
}, "json");
},
async getApplyNumAudit() {
const {data} = await $.post(loc() + "/getApplyNumAudit", this.pageForm)
this.options = [
{label: "总人数" + (data.count1) + "人", value: "0"},
]
},
async clearState() {
this.pageForm.state = ''
this.pageForm.unionId = ''
await this.doSearch()
},
async doSearch() {
this.pageForm.pageNumber = 1;
this.pageData();
await this.getApplyNumAudit()
},
async getModifyConfig() {
const res = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne')
if (res.code === 0) {
this.modifyConfig = res.data
}
},
},
async created() {
await this.getBmUserUnion()
await this.getAgencyList()
await this.getModifyConfig()
await this.doSearch()
}
})
</script>
<!--#
}
#-->
@@ -63,24 +63,24 @@ layout("/layouts/platform.html"){
</el-col>
</el-row>
<!-- <el-row align="middle" class="query-row" type="flex">-->
<!-- <el-col class="query-row-title"></el-col>-->
<!-- <el-col class="query-row-content">-->
<!-- <span>报名路线:</span>-->
<!-- <el-tag :effect="pageForm.state===item.value?'dark':'plain'"-->
<!-- :key="item.value"-->
<!-- :type="item.label"-->
<!-- @click="checkState(item.value)"-->
<!-- style="margin-right: 10px;cursor: pointer;margin-bottom: 5px;font-size: 15px"-->
<!-- v-for="item in options">-->
<!-- {{ item.label }}-->
<!-- </el-tag>-->
<!-- <el-link :underline="false" @click="pageForm.state='';doSearch()"-->
<!-- style="color: red" v-if="options.length&&pageForm.state">清空-->
<!-- </el-link>-->
<!-- <span style="color: red;font-size: 12px;margin-left: 10px">温馨提示:其他工会选我线路,所在工会审核过后,才显示数量</span>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- <el-row align="middle" class="query-row" type="flex">-->
<!-- <el-col class="query-row-title"></el-col>-->
<!-- <el-col class="query-row-content">-->
<!-- <span>报名路线:</span>-->
<!-- <el-tag :effect="pageForm.state===item.value?'dark':'plain'"-->
<!-- :key="item.value"-->
<!-- :type="item.label"-->
<!-- @click="checkState(item.value)"-->
<!-- style="margin-right: 10px;cursor: pointer;margin-bottom: 5px;font-size: 15px"-->
<!-- v-for="item in options">-->
<!-- {{ item.label }}-->
<!-- </el-tag>-->
<!-- <el-link :underline="false" @click="pageForm.state='';doSearch()"-->
<!-- style="color: red" v-if="options.length&&pageForm.state">清空-->
<!-- </el-link>-->
<!-- <span style="color: red;font-size: 12px;margin-left: 10px">温馨提示:其他工会选我线路,所在工会审核过后,才显示数量</span>-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title"></el-col>
@@ -140,7 +140,7 @@ layout("/layouts/platform.html"){
<span>选择路线:</span>
<el-select v-model="pageForm.takePartInLineId" filterable clearable
placeholder="请选择线路"
style="width: 80%" @change="doSearch()">
style="width: 80%" @change="lineChange">
<el-option v-for="item in takePartInLines"
:key="item.id"
:label="item.lineName"
@@ -169,6 +169,20 @@ layout("/layouts/platform.html"){
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<span>出行时间:</span>
<el-select v-model="pageForm.selectId" filterable clearable
placeholder="请选择出行时间"
style="width: 80%" @change="playChange">
<el-option v-for="item in linePlayTimes"
:key="item.times"
:label="item.times"
:value="item.selectId">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
@@ -179,13 +193,23 @@ layout("/layouts/platform.html"){
<el-card shadow="never" class="mt10">
<table-tool label="审核列表" :app="this">
<template #label_end>
<!-- <span style="color: red;margin-left: 10px">温馨提示:省内线路不需要审核</span>-->
</template>
<template #func
v-if="!pageForm.regionalNature||
(pageForm.regionalNature==='省内'&&modifyConfig.isSnLine)||
(pageForm.regionalNature==='省外'&&modifyConfig.isSwLine)">
<el-button size="small"
style="background-color: #fff;border-color: #b3d8ff;color: #1867b0;font-size: 15px"
>{{selectLine.lineName?selectLine.lineName:'全部'}}线路的人数:{{lineSignNumber}}人
</el-button>
<!-- <span v-if="pageForm.takePartInLineId" style="margin-left: 10px">-->
<!-- {{selectLine.lineName}}线路的报名人数:{{lineSignNumber}}-->
<!-- </span>-->
<el-button type="primary" size="small" class="mr10"
@click="openOnekeyAudit">一键审核
</el-button>
@@ -229,7 +253,12 @@ layout("/layouts/platform.html"){
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='isFamily'">
{{row.isFamily?'携带':'未携带'}}{{row.num}}
<el-link v-if="!row.familyNumber" type="primary" @click="openUser(row)">
{{row.isFamily?'携带':'未携带'}}{{row.isFamily}}
</el-link>
<el-link v-else type="primary">
{{row.familyNumber?'携带':'未携带'}}{{row.familyNumber}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='num'">
{{1+row.num}}
@@ -241,9 +270,40 @@ layout("/layouts/platform.html"){
<sapn v-else style="color: #67C23A">暂无</sapn>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="300px">
<el-table-column align="center" header-align="center" label="操作" width="180px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<template v-if="!pageForm.regionalNature
||(pageForm.regionalNature==='省内'&&modifyConfig.isSnLine)
||(pageForm.regionalNature==='省外'&&modifyConfig.isSwLine)">
<el-dropdown-item v-if="ifRecall(row)" :command="{type:'recall',data:row}">
撤回
</el-dropdown-item>
<el-dropdown-item v-if="ifEdit(row)" :command="{type:'handle',data:row}">
审核
</el-dropdown-item>
<template v-if="[2750].includes(row.stateId)">
<el-dropdown-item :command="{type:'modify',data:row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}">
删除
</el-dropdown-item>
</template>
</template>
</el-dropdown-menu>
</el-dropdown>
<!--<el-button @click="openView(row)" size="mini" type="primary">查看
</el-button>
<template v-if="!pageForm.regionalNature||
(pageForm.regionalNature==='省内'&&modifyConfig.isSnLine)||
@@ -255,7 +315,7 @@ layout("/layouts/platform.html"){
type="primary">
审核
</el-button>
</template>
</template>-->
</template>
</el-table-column>
@@ -288,17 +348,24 @@ layout("/layouts/platform.html"){
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-row>
<el-row gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4"
type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row style="margin: 40px 0;text-align: right">
<el-button @click="doAudit(false)" type="danger">退
<el-button @click="$refs.guava.index()">
</el-button>
<el-button @click="doAudit(true)" type="primary">通过
<el-button @click="doAudit(false,true)" type="warning">调整
</el-button>
<el-button @click="doAudit(false,false)" type="danger">拒绝
</el-button>
<el-button @click="doAudit(true,false)" type="primary">通过
</el-button>
</el-row>
</el-form>
@@ -308,7 +375,6 @@ layout("/layouts/platform.html"){
</template>
</guava>
<el-dialog
title="提示"
:visible.sync="dialogVisible"
@@ -326,20 +392,148 @@ layout("/layouts/platform.html"){
<el-input disabled v-model="formData.auditTime"></el-input>
</el-form-item>
</el-col>
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-row>
<el-row gutter="20">
<el-col :span="24">
<el-form-item label="审核意见" prop="auditOpinion">
<el-input maxlength="500" placeholder="请填写您的审核意见" rows="4" type="textarea"
v-model="formData.auditOpinion"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="doOnekeyAudit(false)">取 消</el-button>
<el-button type="primary" @click="doOnekeyAudit(true)">确 定</el-button>
</span>
<el-button @click="dialogVisible = false">返 回</el-button>
<el-button @click="doOnekeyAudit(false,true)" type="warning">调 整</el-button>
<el-button @click="doOnekeyAudit(false,false)" type="danger">拒 绝</el-button>
<el-button type="primary" @click="doOnekeyAudit(true,false)">通 过</el-button>
</span>
</el-dialog>
<el-dialog
title="修改信息"
:visible.sync="editVisible"
:close-on-click-modal="false"
width="50%">
<el-form :model="editFormData" label-width="120px" :rules="rules" ref="editForm" style="margin-right: 40px">
<el-row>
<el-col span="12">
<el-form-item prop="loginName" label="工号">
<el-input v-model="editFormData.loginName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="姓名">
<el-input v-model="editFormData.userName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="userName" label="手机号">
<el-input v-model="editFormData.mobile" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="身份证号">
<el-input v-model="editFormData.idCard" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="unionName" label="工会">
<el-input v-model="editFormData.unionName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="unitName" label="单位">
<el-input v-model="editFormData.unitName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="prop" :label="labelName">
<template v-if="modifyConfig.familyInfo == 2">
<el-collapse v-model="activeNames">
<el-collapse-item title="点击可展开详细信息" name="1">
<el-card shadow="never">
<el-table :data="editFormData.companionList">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="身份证号" prop="idCard"></el-table-column>
<el-table-column label="年龄" prop="age"></el-table-column>
<el-table-column label="床型" prop="bedType">
<template scope="{row}">
{{ row.bedInfo.bedType }}
</template>
</el-table-column>
<el-table-column label="床位" prop="bedNum">
<template scope="{row}">
{{ row.bedInfo.bedNum }}
</template>
</el-table-column>
<el-table-column label="意向拼床人" prop="otherSleepUser">
<template scope="{row}">
{{ row.bedInfo.otherSleepUser ?
row.bedInfo.otherSleepUser : '暂无' }}
</template>
</el-table-column>
<el-table-column label="关系" prop="relation"></el-table-column>
</el-table>
</el-card>
</el-collapse-item>
</el-collapse>
</template>
<template v-else>
<el-input v-model="editFormData.bedType" readonly></el-input>
</template>
</el-form-item>
<!--<el-form-item prop="travelName" label="旅行社">
<el-select v-model="editFormData.agencyId" filterable clearable
placeholder="请选择旅行社"
style="width: 100%">
<el-option v-for="item in agencyLists"
:key="item.id"
:label="item.travelAgencyName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>-->
<el-form-item prop="travelLine" :label="lineLabelName">
<el-select v-model="editFormData.takePartInLineId" filterable clearable
placeholder="请选择线路"
@change="validateLine"
style="width: 100%">
<el-option v-for="item in unionSelectLines"
:key="item.id"
:label="item.lineName + '-' + item.regionalNature + '【' + item.lotName + '】' + '' + item.playStartTime + '至' + item.playEndTime + '' + '' + item.signUpMode + ''"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="specificTime" label="出行时间" v-if="pageForm.state==='3'">
<el-select v-model="editFormData.specificTime" filterable clearable
placeholder="请选择出行时间"
style="width: 100%">
<el-option v-for="item in editSpecificTimes"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
@@ -388,10 +582,35 @@ layout("/layouts/platform.html"){
// {prop: 'userNature', label: '人员性质'},
{prop: 'isFamily', label: '是否携带家属'},
// {prop: 'num', label: '人数'},
{prop: 'isTransferIn', label: '是否转入转出', sortable: true},
// {prop: 'isTransferIn', label: '是否转入转出', sortable: true},
{prop: 'linePlayTime', label: '出行时间', sortable: true},
{prop: 'stateId', label: '审核状态', sortable: true},
],
modifyConfig: {}
modifyConfig: {},
selectLine: {
lineName: '全部'
},
lineSignNumber: 0,
times: null,
linePlayTimes: [],
editVisible: false,
editFormData: {},
rules: {
loginName: [{required: true, message: '请填写工号', trigger: ['blur', 'change']}],
userName: [{required: true, message: '请填写姓名', trigger: ['blur', 'change']}],
unionName: [{required: true, message: '请选择工会', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '请选择单位', trigger: ['blur', 'change']}],
// travelName: [{required: true, message: '请选择旅行社', trigger: ['blur', 'change']}],
specificTime: [{required: true, message: '请选择出行时间', trigger: ['blur', 'change']}],
// travelLine: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
editSpecificTimes: [],
labelName: '',
unionSelectLines: [],
lineLabelName: '',
activeNames:[]
}
},
components: {
@@ -400,8 +619,133 @@ layout("/layouts/platform.html"){
},
methods: {
async doOnekeyAudit(flag) {
const confirm = await this.$confirm('您确定要一键审核您所勾选的信息吗, 是否继续?', '提示', {
async playChange() {
await this.getLineSignNumber()
await this.doSearch()
},
async validateLine() {
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/validSignUpInfo'
, {enroll: JSON.stringify(this.editFormData)})
if (resp.code !== 0) {
this.$message.warning(resp.msg)
this.editFormData.takePartInLineId = ''
}
},
dropdownCommand(command) {
const {type, data} = command
if (type === 'view') {
this.openView(data)
} else if (type === 'recall') {
this.doRecall(data)
} else if (type === 'handle') {
this.openEdit(data)
} else if (type === 'modify') {
this.openModify(data)
} else if (type === 'delete') {
this.doDelete(data)
}
},
async doDelete(row){
this.$confirm("您确定要删除【<span style='color: red'>" + row.userName + "</span>】的此条报名信息吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
dangerouslyUseHTMLString: true,
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/doDeleteMyEnrollInfoById/' + row.id)
if (resp.code === 0) {
await this.doSearch()
this.$message.success('删除成功')
await this.getLineSignNumber();
} else {
this.$message.warning(resp.msg)
}
}
}
})
},
async openModify(row) {
this.editFormData = {};
const resp = await $.get("/platform/theRapyRecuperation/TheRapyAudit/findOne", {id: row.id})
if (resp.code === 0) {
this.editFormData = {...resp.data.viewData}
if (this.modifyConfig.familyInfo == 2) {
this.editFormData.companionList = resp.data.viewData.companionList
this.labelName = "家属信息"
} else {
this.editFormData.bedType = resp.data.viewData.familyNumber
this.labelName = "家属数量"
}
}
if (row.takePartInBaseManagementId) {
this.editSpecificTime(row.takePartInBaseManagementId);
this.lineLabelName = "酒店"
} else if (row.takePartInLineId) {
this.lineLabelName = '线路'
}
this.editVisible = true
},
async doEdit() {
this.$refs['editForm'].validate().then(async () => {
const confirm = await this.$confirm('您确定要修改这位老师的报名信息吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
if (!this.editFormData.takePartInLineId && !this.editFormData.takePartInBaseManagementId){
this.$message.warning('请选择线路')
return
}
const resp = await $.post('/platform/theRapyRecuperation/user/query/doEdit', this.editFormData)
if (resp.code === 0) {
this.$notify.success(resp.msg)
this.editVisible = false
await this.doSearch();
await this.getLineSignNumber();
} else {
this.$notify.error(resp.msg)
}
}
})
},
async lineChange(val) {
console.log(val)
this.pageForm.selectId = ''
if (val) {
this.selectLine = this.takePartInLines.find(o => o.id === val)
await this.getLinePlayTimeByLineId(val);
} else {
this.selectLine.lineName = ''
}
await this.getLineSignNumber()
await this.doSearch()
},
async getLinePlayTimeByLineId(id) {
const resp = await $.get(loc() + '/getLinePlayTimeByLineId', {
lineId: id,
year: this.pageForm.year,
signUpMode: 2,
})
if (resp.code === 0) {
this.linePlayTimes = resp.data
}
},
async getLineSignNumber() {
const resp = await $.get('/platform/theRapyRecuperation/TheRapyXghAudit/getLineNumber', this.pageForm)
this.lineSignNumber = resp.data
},
async doOnekeyAudit(flag, adjustment) {
let msg = '';
if (adjustment && !flag) {
msg = '您确定要一键【调整】您所勾选的报名信息吗,调整后该报名信息将不会在审核列表中展示, 是否继续?'
} else if (!adjustment && !flag) {
msg = '您确定要一键【拒绝】您所勾选的报名信息吗,是否继续?'
} else if (!adjustment && flag) {
msg = '您确定要一键【通过】您所勾选的报名信息吗,是否继续?'
}
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
@@ -410,13 +754,14 @@ layout("/layouts/platform.html"){
const resp = await $.post(loc() + "/doOnekeyAudit", {
ids: JSON.stringify(this.tableSelection),
flag: flag,
adjustment: adjustment,
auditOpinion: this.formData.auditOpinion
})
if (resp.code === 0){
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
await this.doSearch()
this.dialogVisible = false
}else {
} else {
this.$notify.warning({title: '失败', message: resp.msg});
this.dialogVisible = false
}
@@ -461,17 +806,25 @@ layout("/layouts/platform.html"){
})
if (confirm === "confirm") {
const resp = await $.post(loc() + "/doRecall", {id: row.id})
if (resp.code === 0){
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
await this.doSearch()
}else {
} else {
this.$notify.warning({title: '失败', message: resp.msg});
}
}
},
async doAudit(flag) {
const confirm = await this.$confirm('您确定要' + (flag ? '通过' : '退回') + '吗, 是否继续?', '提示', {
async doAudit(flag, adjustment) {
let msg = '';
if (adjustment && !flag) {
msg = '您确定要【调整】该报名信息吗,调整后该报名信息将不会在审核列表中展示, 是否继续?'
} else if (!adjustment && !flag) {
msg = '您确定要【拒绝】该报名信息吗,是否继续?'
} else if (!adjustment && flag) {
msg = '您确定要【通过】该报名信息吗,是否继续?'
}
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
@@ -479,15 +832,16 @@ layout("/layouts/platform.html"){
if (confirm === "confirm") {
const resp = await $.post(loc() + "/doAudit", {
flag: flag,
adjustment: adjustment,
id: this.formData.id,
isTransferIn: this.formData.isTransferIn,
auditOpinion: this.formData.auditOpinion
})
if (resp.code === 0){
if (resp.code === 0) {
this.$notify.success({title: '成功', message: resp.msg});
await this.doSearch()
this.$refs.guava.index()
}else {
} else {
this.$notify.warning({title: '失败', message: resp.msg});
}
@@ -591,12 +945,23 @@ layout("/layouts/platform.html"){
this.modifyConfig = res.data
}
},
async getUnionSelectLine() {
const resp = await $.post('/platform/theRapyRecuperation/user/query/getUnionSelectLine', {
year: this.pageForm.year,
signUpMode: 1,
})
if (resp.code === 0) {
this.unionSelectLines = resp.data
}
},
},
async created() {
await this.getBmUserUnion()
await this.getModifyConfig()
this.takePartInLines = await this.getXlByUnion()
await this.doSearch()
await this.getLineSignNumber()
await this.getUnionSelectLine()
}
})
</script>
@@ -28,47 +28,45 @@ layout("/layouts/platform.html"){
</el-input>
</div>
</div>
<template v-if="!isLxyGys">
<div class="search-item">
<div class="search-item-label">旅行社:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.travelAgencyId"
@change="doSearch">
<el-option :key="item.id"
:label="item.travelAgencyName"
:value="item.id"
v-for="item in travelAgencyList"
></el-option>
</el-select>
</div>
<div class="search-item">
<div class="search-item-label">旅行社:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.travelAgencyId"
@change="doSearch">
<el-option :key="item.id"
:label="item.travelAgencyName"
:value="item.id"
v-for="item in travelAgencyList"
></el-option>
</el-select>
</div>
<div class="search-item">
<div class="search-item-label">活动范围:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.regionalNature"
@change="doSearch">
<el-option key="1" label="省内" value="省内"></el-option>
<el-option key="1" label="省" value="省"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">活动范围:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.regionalNature"
@change="doSearch">
<el-option key="1" label="省" value="省"></el-option>
<el-option key="1" label="省外" value="省外"></el-option>
</el-select>
</div>
<div class="search-item">
<div class="search-item-label">标段时间:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.lotId"
@change="doSearch">
<el-option :key="item.id"
:label="item.lotName"
:value="item.id"
v-for="item in modifyBdList"
></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">标段时间:</div>
<div class="search-item-option">
<el-select clearable filterable style="width: 100%"
v-model="pageForm.lotId"
@change="doSearch">
<el-option :key="item.id"
:label="item.lotName"
:value="item.id"
v-for="item in modifyBdList"
></el-option>
</el-select>
</div>
</template>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
@@ -78,19 +76,14 @@ layout("/layouts/platform.html"){
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="目的地列表">
<template #func>
<template v-if="!isLxyGys">
<el-button @click="openImport" size="medium" type="primary"
style="margin-right: 10px">导入目的地
</el-button>
<el-button @click="openAdd" size="medium" type="primary">新建目的地</el-button>
</template>
<el-button @click="openImport" size="medium" type="primary" style="margin-right: 10px">导入目的地</el-button>
<el-button @click="openAdd" size="medium" type="primary">新建目的地</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center"
header-align="center">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index"
<el-table-column :index="indexMethod" align="center" header-align="center" label="序号" type="index"
width="80px"></el-table-column>
<el-table-column
:label="column.label"
@@ -103,7 +96,6 @@ layout("/layouts/platform.html"){
>
<template scope="{row}" v-if="column.prop==='isDisabled'">
<el-switch
:disabled="isLxyGys"
:active-value="false"
:inactive-value="true"
@change="(val)=>{baseStatusChange(row.id)}"
@@ -126,13 +118,9 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="操作" width="250px">
<template scope="{row}">
<el-button @click="openView(row.id)" size="mini" type="primary">查看
</el-button>
<el-button @click="openEdit(row.id)" size="mini" type="primary">编辑
</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger"
v-if="!isLxyGys">删除
</el-button>
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
<el-button @click="openEdit(row.id)" size="mini" type="primary">编辑</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -147,7 +135,6 @@ layout("/layouts/platform.html"){
<el-date-picker style="width: 100%"
@change="yearChange"
type="year"
:disabled="isLxyGys"
v-model="formData.year"
value-format="yyyy"></el-date-picker>
</el-form-item>
@@ -166,8 +153,7 @@ layout("/layouts/platform.html"){
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="旅行社名称" prop="travelAgencyId">
<el-select clearable filterable style="width: 100%"
v-model="formData.travelAgencyId" :disabled="isLxyGys">
<el-select clearable filterable style="width: 100%" v-model="formData.travelAgencyId">
<el-option :key="item.id"
:label="item.travelAgencyName+'('+ item.year +'年)'"
:value="item.id"
@@ -180,8 +166,7 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="组织形式" prop="createMode">
<el-radio-group size="small" v-model="formData.createMode"
:disabled="isLxyGys">
<el-radio-group size="small" v-model="formData.createMode">
<el-radio :label="1" border>校工会组织</el-radio>
<el-radio :label="2" border>分工会组织</el-radio>
</el-radio-group>
@@ -193,8 +178,7 @@ layout("/layouts/platform.html"){
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="活动范围" prop="regionalNature">
<el-radio-group size="small" v-model="formData.regionalNature"
:disabled="isLxyGys">
<el-radio-group size="small" v-model="formData.regionalNature">
<el-radio label="省内" border>省内</el-radio>
<el-radio label="省外" border>省外</el-radio>
</el-radio-group>
@@ -206,9 +190,7 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="标段时间" prop="lotId">
<!--<el-input clearable maxlength="50" v-model="formData.lotId"></el-input>-->
<el-select clearable filterable style="width: 100%"
v-model="formData.lotId"
:disabled="isLxyGys"
<el-select clearable filterable style="width: 100%" v-model="formData.lotId"
@change="doBdModify">
<el-option :key="item"
:label="item.lotName"
@@ -220,8 +202,7 @@ layout("/layouts/platform.html"){
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="预计费用(元/人次)" prop="estimatedCost">
<el-select clearable filterable style="width: 100%"
v-model="formData.estimatedCost" :disabled="isLxyGys">
<el-select clearable filterable style="width: 100%" v-model="formData.estimatedCost">
<el-option :key="item.id"
:label="item.activityCost"
:value="item.activityCost"
@@ -235,14 +216,12 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="目的地联系人" prop="baseContactPerson">
<el-input clearable maxlength="20"
v-model="formData.baseContactPerson"></el-input>
<el-input clearable maxlength="20" v-model="formData.baseContactPerson"></el-input>
</el-form-item>
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="联系人电话" prop="baseContactNumber">
<el-input clearable maxlength="20"
v-model="formData.baseContactNumber"></el-input>
<el-input clearable maxlength="20" v-model="formData.baseContactNumber"></el-input>
</el-form-item>
</el-col>
</el-row>
@@ -252,7 +231,6 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="报名开始时间" prop="signUpStartTime">
<el-date-picker style="width: 100%"
:disabled="isLxyGys"
type="datetime"
v-model="formData.signUpStartTime"
format="yyyy-MM-dd HH:mm"
@@ -263,7 +241,6 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="报名截至时间" prop="signUpEndTime">
<el-date-picker style="width: 100%"
:disabled="isLxyGys"
type="datetime"
v-model="formData.signUpEndTime"
format="yyyy-MM-dd HH:mm"
@@ -277,7 +254,6 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="变更截至时间" prop="changeEndTime">
<el-date-picker style="width: 100%"
:disabled="isLxyGys"
type="datetime"
v-model="formData.changeEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
@@ -303,7 +279,6 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="活动开始时间" prop="activityStartTime">
<el-date-picker
:disabled="isLxyGys"
placeholder="活动开始时间"
style="width: 100%"
type="date"
@@ -315,7 +290,6 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="活动结束时间" prop="activityEndTime">
<el-date-picker
:disabled="isLxyGys"
placeholder="活动结束时间"
style="width: 100%"
type="date"
@@ -330,21 +304,7 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :md="24" :sm="24" :xs="24">
<el-form-item label="详细信息" prop="content">
<div id="lineContent"></div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="24" :sm="24" :xs="24">
<el-form-item label="上传详细信息图片">
<el-button type="primary" @click="scFilesDrawer = true" size="small">
上传详细信息图片
</el-button>
<text-editor v-model="formData.content"></text-editor>
</el-form-item>
</el-col>
</el-row>
@@ -352,7 +312,6 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="是否启用" prop="isDisabled">
<el-switch
:disabled="isLxyGys"
:active-value="false"
:inactive-value="true"
active-color="#13ce66"
@@ -366,8 +325,7 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :md="24" :sm="24" :xs="24">
<el-form-item label="图片上传" prop="files">
<file-upload :files.sync="formData.files" :max="1"
:type="['jpg', 'jpeg', 'png']">
<file-upload :files.sync="formData.files" :max="1" :type="['jpg', 'jpeg', 'png']">
<template #el-upload__tip>
<div class="el-upload__tip" slot="tip">
图片类请上传jpg/png/jpeg格式,上传数量为1个
@@ -433,59 +391,10 @@ layout("/layouts/platform.html"){
</span>
</el-dialog>
</guava>
<el-drawer
size="50%"
:visible.sync="scFilesDrawer"
direction="rtl">
<el-card shadow="never">
<template #header>
<div style="display:flex;justify-content: space-between;align-items: center">
<h3 style="color: #1867b0">上传文件</h3>
<file-upload :files.sync="files" ref="fileUpload"
:source="1"
:max="20"></file-upload>
</div>
</template>
<el-table :data="files" border class="mt10" stripe
style="width: 100%">
<el-table-column label="文件名"
show-overflow-tooltip
prop="filename"></el-table-column>
<el-table-column label="文件路径" prop="url" show-overflow-tooltip>
<template scope="{row}">
{{ APP_DOMAIN + FILE_STREAM_PREVIEW_ADDRESS +
"?id=" + row.id }}
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="操作"
width="100px"
>
<template slot-scope="{row,$index}">
<el-button
icon="el-icon-folder-checked"
size="mini" type="primary"
@click="doCopy(row)">复制
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-row class="mt20 mr20" justify="end" type="flex">
<el-button @click="scFilesDrawer=false" type="primary">关闭</el-button>
</el-row>
</el-drawer>
</div>
<script>
const vue = new Vue({
new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
@@ -542,8 +451,6 @@ layout("/layouts/platform.html"){
callback()
}
return {
scFilesDrawer: false,
files: [],
pageForm: {
year: new Date().getFullYear().toString(),
unionId: '',
@@ -560,7 +467,7 @@ layout("/layouts/platform.html"){
id: '',
sortNumber: '',
baseName: '',
travelAgencyId: null,
travelAgencyId: '',
regionalNature: '省内',
year: new Date().getFullYear().toString(),
isDisabled: false,
@@ -593,71 +500,29 @@ layout("/layouts/platform.html"){
{label: '是否启用', prop: 'isDisabled', sortable: true}
],
rules: {
sortNumber: [{
required: false,
message: '请输入排序编号',
trigger: ['change', 'blur']
}],
sortNumber: [{required: false, message: '请输入排序编号', trigger: ['change', 'blur']}],
baseName: [{required: true, message: '请输入目的地名称', trigger: ['change', 'blur']}],
// travelAgencyId: [{required: true, message: '请选择旅行社', trigger: ['change', 'blur']}],
regionalNature: [{
required: true,
message: '请选择区域性质',
trigger: ['change', 'blur']
}],
travelAgencyId: [{required: true, message: '请选择旅行社', trigger: ['change', 'blur']}],
regionalNature: [{required: true, message: '请选择区域性质', trigger: ['change', 'blur']}],
year: [{required: true, message: '请选择年度', trigger: ['change', 'blur']}],
lotId: [{required: true, message: '请选择出行天数', trigger: ['change', 'blur']}],
content: [{required: false, message: '请输入详细内容', trigger: ['change', 'blur']}],
signUpStartTime: [{
required: true,
message: '请选择报名开始时间',
trigger: ['change', 'blur']
}],
signUpEndTime: [{
required: true,
validator: validateSignUpEndTime,
trigger: ['change', 'blur']
}],
changeEndTime: [{
required: true,
validator: validateChangeEndTime,
trigger: ['change', 'blur']
}],
signUpStartTime: [{required: true, message: '请选择报名开始时间', trigger: ['change', 'blur']}],
signUpEndTime: [{required: true, validator: validateSignUpEndTime, trigger: ['change', 'blur']}],
changeEndTime: [{required: true, validator: validateChangeEndTime, trigger: ['change', 'blur']}],
files: [{required: true, message: '请上传图片', trigger: ['change', 'blur']}],
createMode: [{required: true, message: '请选择组织方式', trigger: ['change', 'blur']}],
activityStartTime: [{
required: true,
validator: validateActivityStartTime,
trigger: ['change', 'blur']
}],
activityEndTime: [{
required: true,
validator: validateActivityEndTime,
trigger: ['change', 'blur']
}],
estimatedCost: [{
required: true,
message: '请输入预计费用',
trigger: ['change', 'blur']
}],
activityStartTime: [{ required: true, validator: validateActivityStartTime, trigger: ['change', 'blur'] }],
activityEndTime: [{ required: true, validator: validateActivityEndTime, trigger: ['change', 'blur'] }],
estimatedCost: [{required: true, message: '请输入预计费用', trigger: ['change', 'blur']}],
},
//目的地导入
importVisible: false,
importLoading: false,
importData: {},
isLxyGys: false,
}
},
methods: {
doCopy(row) {
const input = document.createElement('input')
input.value = APP_DOMAIN + FILE_STREAM_PREVIEW_ADDRESS + "?id=" + row.id // 设置复制内容
document.body.appendChild(input) // 添加临时实例
input.select() // 选择实例内容
document.execCommand('Copy') // 执行复制
document.body.removeChild(input) // 删除临时实例
this.$message.success('复制成功!')
},
async doSearch() {
this.formData.year = this.pageForm.year;
await this.yearChange();
@@ -668,7 +533,6 @@ layout("/layouts/platform.html"){
this.travelAgencyList = resp.data
},
async openAdd() {
this.files = []
this.$refs.guava.edit()
this.$nextTick(() => {
if (this.$refs['form']) {
@@ -679,7 +543,6 @@ layout("/layouts/platform.html"){
})
},
async openEdit(id) {
this.files = []
const resp = await $.post(loc() + '/selectBaseManageById/' + id)
if (resp.code === 0) {
this.$refs.guava.edit()
@@ -803,10 +666,10 @@ layout("/layouts/platform.html"){
processData: false,
contentType: false,
success: (data) => {
if (data.code === 0) {
if (data.code === 0){
this.pageData();
this.importVisible = false
} else {
}else {
this.importVisible = false
}
},
@@ -818,19 +681,13 @@ layout("/layouts/platform.html"){
},
},
async created() {
//如果不是超级管理员,校工会,分工会,就是供应商
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'false') {
this.isLxyGys = true
}
await this.initPageData();
this.pageData();
},
computed: {
editDialogTitle() {
return this.formData.id ? '编辑目的地' : '新增目的地'
}
},
})
</script>
@@ -3,12 +3,16 @@ layout("/layouts/platform.html"){
#-->
<style>
.mr0-radio {
display: flex;
}
/*.mr0-radio {*/
/* display: flex;*/
/*}*/
.mr0-radio label {
margin-right: 0 !important;
/*.mr0-radio label {*/
/* margin-right: 0 !important;*/
/*}*/
.el-radio {
margin-right: 0;
}
</style>
@@ -17,19 +21,55 @@ layout("/layouts/platform.html"){
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-label">年度范围</div>
<div class="search-item-option">
<el-date-picker
v-model="pageForm.startYear"
type="year"
class="picker-year"
format="yyyy"
style="width: 46%"
value-format="yyyy"
@change="handleChangeYear"
>
</el-date-picker>
<span></span>
<el-date-picker
v-model="pageForm.endYear"
type="year"
class="picker-year"
format="yyyy"
style="width: 46%"
value-format="yyyy"
@change="handleChangeYear"
>
</el-date-picker>
<!--<el-date-picker
style="width: 100%"
@change="doSearch"
placeholder="选择年度"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</el-date-picker>-->
</div>
</div>
<div class="search-item">
<div class="search-item-label">旅行社:</div>
<div class="search-item-option">
<el-select @change="doSearch"
clearable
filterable
style="width: 100%"
v-model="pageForm.travelAgencyId">
<el-option :key="item.id"
:label="item.travelAgencyName"
:value="item.id"
v-for="item in travelAgencyOptions"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">线路名称:</div>
<div class="search-item-option">
@@ -40,41 +80,22 @@ layout("/layouts/platform.html"){
</el-input>
</div>
</div>
<template v-if="!isLxyGys">
<div class="search-item">
<div class="search-item-label">旅行社:</div>
<div class="search-item-option">
<el-select @change="doSearch"
clearable
filterable
style="width: 100%"
v-model="pageForm.travelAgencyId">
<el-option :key="item.id"
:label="item.travelAgencyName"
:value="item.id"
v-for="item in travelAgencyOptions"></el-option>
</el-select>
</div>
<div class="search-item">
<div class="search-item-label">时间标段:</div>
<div class="search-item-option">
<el-select @change="doSearch" clearable filterable
style="width: 100%"
v-model="pageForm.lotId">
<el-option :key="item.id"
:label="item.lotName"
:value="item.id"
v-for="item in lotList"
></el-option>
</el-select>
</div>
<div class="search-item">
<div class="search-item-label">时间标段:</div>
<div class="search-item-option">
<el-select @change="doSearch" clearable filterable
style="width: 100%"
v-model="pageForm.lotId">
<el-option :key="item.id"
:label="item.lotName"
:value="item.id"
v-for="item in lotList"
></el-option>
</el-select>
</div>
</div>
</template>
</div>
<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')}">
<div class="search-item" v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')}">
<div class="search-item-label">分工会:</div>
<div class="search-item-option">
<el-select @change="doSearch"
@@ -99,17 +120,14 @@ layout("/layouts/platform.html"){
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="线路列表">
<template #func>
<template v-if="!isLxyGys">
<el-button @click="openImport" size="medium" type="primary">导入线路</el-button>
<el-button @click="openAdd" size="medium" type="primary">新建线路</el-button>
</template>
<el-button @click="openImport" size="medium" type="primary">导入线路</el-button>
<el-button @click="openAdd" size="medium" type="primary">新建线路</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
align="center"
header-align="center">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index"
<el-table-column :index="indexMethod" align="center" header-align="center" label="序号" type="index"
width="80px"></el-table-column>
<el-table-column
:label="column.label"
@@ -123,7 +141,6 @@ layout("/layouts/platform.html"){
>
<template scope="{row}" v-if="column.prop==='isDisabled'">
<el-switch
:disabled="isLxyGys"
:active-value="false"
:inactive-value="true"
@change="(val)=>{lineStatusChange(row.id)}"
@@ -143,7 +160,7 @@ layout("/layouts/platform.html"){
type="text">
查看详情
</el-button>
<!-- v-if="row.createMode===2 && row.signUpMode===1"-->
<!-- v-if="row.createMode===2 && row.signUpMode===1"-->
<!--<span v-else>
{{row.playStartTime + '至' + row.playEndTime}}
</span>-->
@@ -151,13 +168,9 @@ layout("/layouts/platform.html"){
</el-table-column>
<el-table-column label="操作" width="250px">
<template scope="{row}">
<el-button @click="openView(row.id)" size="mini" type="primary">查看
</el-button>
<el-button @click="openEdit(row.id)" size="mini" type="primary">编辑
</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger"
v-if="!isLxyGys">删除
</el-button>
<el-button @click="openView(row.id)" size="mini" type="primary">查看</el-button>
<el-button @click="openEdit(row.id)" size="mini" type="primary">编辑</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -181,7 +194,6 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="年度" prop="year">
<el-date-picker style="width: 100%"
:disabled="isLxyGys"
@change="yearChange"
type="year"
v-model="formData.year"
@@ -197,14 +209,12 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="线路名称" prop="lineName">
<el-input maxlength="50" v-model="formData.lineName"
:disabled="isLxyGys"></el-input>
<el-input maxlength="50" v-model="formData.lineName"></el-input>
</el-form-item>
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="旅行社名称" prop="travelAgencyId">
<el-select clearable filterable style="width: 100%"
v-model="formData.travelAgencyId" :disabled="isLxyGys">
<el-select clearable filterable style="width: 100%" v-model="formData.travelAgencyId">
<el-option :key="item.id"
:label="item.travelAgencyName+'('+ item.year +'年)'"
:value="item.id"
@@ -236,9 +246,7 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="线路类型" prop="regionalNature">
<el-radio-group class="mr0-radio" size="small"
:disabled="isLxyGys"
v-model="formData.regionalNature">
<el-radio-group class="mr0-radio" size="small" v-model="formData.regionalNature">
<el-radio :label="item.value"
border v-for="item in regionalNatureList">
{{item.label}}
@@ -249,7 +257,7 @@ layout("/layouts/platform.html"){
<el-col :span="12">
<el-form-item label="时间标段" prop="lotId">
<el-select clearable filterable style="width: 100%"
v-model="formData.lotId" :disabled="isLxyGys">
v-model="formData.lotId">
<el-option :key="item.id"
:label="item.lotName"
:value="item.id"
@@ -262,8 +270,7 @@ layout("/layouts/platform.html"){
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="交通工具" prop="trafficTools">
<el-input clearable maxlength="50"
v-model="formData.trafficTools"></el-input>
<el-input clearable maxlength="50" v-model="formData.trafficTools"></el-input>
</el-form-item>
</el-col>
</el-row>
@@ -272,22 +279,20 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="最少成团人数" prop="minimumGroupSize">
<el-form-item label="最少参与教工" prop="minimumGroupSize">
<el-input-number :max="1000"
:min="config.groupNumber"
:precision="0"
style="width: 100%"
:disabled="isLxyGys"
v-model="formData.minimumGroupSize"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预计人数(含家属" prop="estimatedFamilyNumbers">
<el-form-item label="成团人数包括家属" prop="estimatedFamilyNumbers">
<el-input-number :max="1000"
:min="1"
:precision="0"
style="width: 100%"
:disabled="isLxyGys"
v-model="formData.estimatedFamilyNumbers"></el-input-number>
</el-form-item>
</el-col>
@@ -295,8 +300,7 @@ layout("/layouts/platform.html"){
</el-col>
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="预计费用(元/人次)" prop="estimatedCost">
<el-input clearable maxlength="50" :disabled="isLxyGys"
v-model="formData.estimatedCost"></el-input>
<el-input clearable maxlength="50" v-model="formData.estimatedCost"></el-input>
</el-form-item>
</el-col>
</el-row>
@@ -304,8 +308,7 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="组织形式" prop="signUpMode">
<el-radio-group class="mr0-radio" size="small" :disabled="isLxyGys"
v-model="formData.signUpMode">
<el-radio-group class="mr0-radio" size="small" v-model="formData.signUpMode">
<el-radio :label="item.value" v-if="isShow(item.roles)"
size="small"
border v-for="item in signUpModeList">
@@ -322,8 +325,7 @@ layout("/layouts/platform.html"){
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="联系人" prop="lineContact">
<el-input clearable max="50" :disabled="isLxyGys"
v-model="formData.lineContact"></el-input>
<el-input clearable max="50" v-model="formData.lineContact"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
@@ -331,104 +333,93 @@ layout("/layouts/platform.html"){
{ required: false, message: '手机号码不能为空', trigger: 'blur' },
{ pattern: /^1[34578]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }
]" label="联系方式" prop="lineContactPhone">
<el-input clearable :disabled="isLxyGys"
v-model="formData.lineContactPhone"></el-input>
<el-input clearable v-model="formData.lineContactPhone"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
<!-- <template v-if="formData.signUpMode===2 || formData.createMode===1">-->
<!-- <el-row :gutter="20">-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="报名开始时间" prop="signUpStartTime">-->
<!-- <el-date-picker style="width: 100%"-->
<!-- type="datetime"-->
<!-- v-model="formData.signUpStartTime"-->
<!-- format="yyyy-MM-dd HH:mm"-->
<!-- value-format="yyyy-MM-dd HH:mm:ss">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="报名截至时间" prop="signUpEndTime">-->
<!-- <el-date-picker style="width: 100%"-->
<!-- type="datetime"-->
<!-- v-model="formData.signUpEndTime"-->
<!-- format="yyyy-MM-dd HH:mm"-->
<!-- value-format="yyyy-MM-dd HH:mm:ss">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- <template v-if="formData.signUpMode===2 || formData.createMode===1">-->
<!-- <el-row :gutter="20">-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="报名开始时间" prop="signUpStartTime">-->
<!-- <el-date-picker style="width: 100%"-->
<!-- type="datetime"-->
<!-- v-model="formData.signUpStartTime"-->
<!-- format="yyyy-MM-dd HH:mm"-->
<!-- value-format="yyyy-MM-dd HH:mm:ss">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="报名截至时间" prop="signUpEndTime">-->
<!-- <el-date-picker style="width: 100%"-->
<!-- type="datetime"-->
<!-- v-model="formData.signUpEndTime"-->
<!-- format="yyyy-MM-dd HH:mm"-->
<!-- value-format="yyyy-MM-dd HH:mm:ss">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- <el-row :gutter="20">-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="变更截至时间" prop="changeEndTime">-->
<!-- <el-date-picker style="width: 100%"-->
<!-- type="datetime"-->
<!-- v-model="formData.changeEndTime"-->
<!-- value-format="yyyy-MM-dd HH:mm:ss">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item>-->
<!-- <template #label>-->
<!-- <span class="text-primary">-->
<!-- <i class="el-icon-warning"></i>-->
<!-- 温馨提醒:-->
<!-- </span>-->
<!-- </template>-->
<!-- <span class="text-primary">-->
<!-- 变更时间应该大于报名截至时间,小于出行时间。-->
<!-- </span>-->
<!-- <el-row :gutter="20">-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="变更截至时间" prop="changeEndTime">-->
<!-- <el-date-picker style="width: 100%"-->
<!-- type="datetime"-->
<!-- v-model="formData.changeEndTime"-->
<!-- value-format="yyyy-MM-dd HH:mm:ss">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item>-->
<!-- <template #label>-->
<!-- <span class="text-primary">-->
<!-- <i class="el-icon-warning"></i>-->
<!-- 温馨提醒:-->
<!-- </span>-->
<!-- </template>-->
<!-- <span class="text-primary">-->
<!-- 变更时间应该大于报名截至时间,小于出行时间。-->
<!-- </span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- <el-row :gutter="20">-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="出行开始时间" prop="playStartTime">-->
<!-- <el-date-picker-->
<!-- placeholder="出行开始时间"-->
<!-- style="width: 100%"-->
<!-- type="date"-->
<!-- v-model="formData.playStartTime"-->
<!-- value-format="yyyy-MM-dd">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="出行结束时间" prop="playEndTime">-->
<!-- <el-date-picker-->
<!-- placeholder="出行结束时间"-->
<!-- style="width: 100%"-->
<!-- type="date"-->
<!-- v-model="formData.playEndTime"-->
<!-- value-format="yyyy-MM-dd">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </template>-->
<!-- <el-row :gutter="20">-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="出行开始时间" prop="playStartTime">-->
<!-- <el-date-picker-->
<!-- placeholder="出行开始时间"-->
<!-- style="width: 100%"-->
<!-- type="date"-->
<!-- v-model="formData.playStartTime"-->
<!-- value-format="yyyy-MM-dd">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :md="12" :sm="24" :xs="24">-->
<!-- <el-form-item label="出行结束时间" prop="playEndTime">-->
<!-- <el-date-picker-->
<!-- placeholder="出行结束时间"-->
<!-- style="width: 100%"-->
<!-- type="date"-->
<!-- v-model="formData.playEndTime"-->
<!-- value-format="yyyy-MM-dd">-->
<!-- </el-date-picker>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </template>-->
<el-row :gutter="20">
<el-col :md="24" :sm="24" :xs="24">
<el-form-item label="线路内容" prop="content">
<div id="lineContent"></div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :md="24" :sm="24" :xs="24">
<el-form-item label="上传详细信息图片">
<el-button type="primary" @click="scFilesDrawer = true" size="small">
上传线路内容图片
</el-button>
<text-editor v-model="formData.content"></text-editor>
</el-form-item>
</el-col>
</el-row>
@@ -436,7 +427,6 @@ layout("/layouts/platform.html"){
<el-col :md="12" :sm="24" :xs="24">
<el-form-item label="是否启用" prop="isDisabled">
<el-switch
:disabled="isLxyGys"
:active-value="false"
:inactive-value="true"
active-color="#13ce66"
@@ -536,54 +526,6 @@ layout("/layouts/platform.html"){
</el-dialog>
</guava>
<el-drawer
size="50%"
:visible.sync="scFilesDrawer"
direction="rtl">
<el-card shadow="never">
<template #header>
<div style="display:flex;justify-content: space-between;align-items: center">
<h3 style="color: #1867b0">上传文件</h3>
<file-upload :files.sync="files" ref="fileUpload"
:source="1"
:max="20"></file-upload>
</div>
</template>
<el-table :data="files" border class="mt10" stripe
style="width: 100%">
<el-table-column label="文件名"
show-overflow-tooltip
prop="filename"></el-table-column>
<el-table-column label="文件路径" prop="url" show-overflow-tooltip>
<template scope="{row}">
{{ APP_DOMAIN + FILE_STREAM_PREVIEW_ADDRESS +
"?id=" + row.id }}
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
label="操作"
width="100px"
>
<template slot-scope="{row,$index}">
<el-button
icon="el-icon-folder-checked"
size="mini" type="primary"
@click="doCopy(row)">复制
</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-row class="mt20 mr20" justify="end" type="flex">
<el-button @click="scFilesDrawer=false" type="primary">关闭</el-button>
</el-row>
</el-drawer>
</div>
<script>
@@ -659,71 +601,31 @@ layout("/layouts/platform.html"){
],
editDialogVisible: false,
rules: {
serialNumber: [{
required: true,
message: '请输入排序号',
trigger: ['change', 'blur']
}],
serialNumber: [{required: true, message: '请输入排序号', trigger: ['change', 'blur']}],
lineName: [{required: true, message: '请输入线路名称', trigger: ['change', 'blur']}],
// travelAgencyId: [{required: true, message: '请选择旅行社', trigger: ['change', 'blur']}],
regionalNature: [{
required: true,
message: '请选择区域性质',
trigger: ['change', 'blur']
}],
minimumGroupSize: [{
required: true,
message: '请输入最少成团人数',
trigger: ['change', 'blur']
}],
travelAgencyId: [{required: true, message: '请选择旅行社', trigger: ['change', 'blur']}],
regionalNature: [{required: true, message: '请选择区域性质', trigger: ['change', 'blur']}],
minimumGroupSize: [{required: true, message: '请输入最少参与教工', trigger: ['change', 'blur']}],
year: [{required: true, message: '请选择年度', trigger: ['change', 'blur']}],
playNumberOfDays: [{
required: true,
message: '请输入游玩天数',
trigger: ['change', 'blur']
}],
playNumberOfDays: [{required: true, message: '请输入游玩天数', trigger: ['change', 'blur']}],
//content: [{required: true, message: '请输入线路内容', trigger: ['change', 'blur']}],
signUpStartTime: [{
required: true,
message: '请选择报名开始时间',
trigger: ['change', 'blur']
}],
signUpEndTime: [{
required: true,
validator: validateSignUpEndTime,
trigger: ['change', 'blur']
}],
changeEndTime: [{
required: true,
validator: validateChangeEndTime,
trigger: ['change', 'blur']
}],
signUpEndTime: [{required: true, validator: validateSignUpEndTime, trigger: ['change', 'blur']}],
changeEndTime: [{required: true, validator: validateChangeEndTime, trigger: ['change', 'blur']}],
//files: [{required: true, message: '请上传移动端缩略图', trigger: ['change', 'blur']}],
signUpMode: [{required: true, message: '请选择报名模式', trigger: ['change', 'blur']}],
playStartTime: [{
required: true,
message: '请选择出行开始时间',
trigger: ['change', 'blur']
}],
playEndTime: [{
required: true,
validator: validatePlayEndTime,
trigger: ['change', 'blur']
}],
trafficTools: [{
required: false,
message: '请输入交通工具',
trigger: ['change', 'blur']
}],
estimatedCost: [{
required: false,
message: '请输入预计费用',
trigger: ['change', 'blur']
}],
playStartTime: [{required: true, message: '请选择出行开始时间', trigger: ['change', 'blur']}],
playEndTime: [{required: true, validator: validatePlayEndTime, trigger: ['change', 'blur']}],
trafficTools: [{required: false, message: '请输入交通工具', trigger: ['change', 'blur']}],
estimatedCost: [{required: false, message: '请输入预计费用', trigger: ['change', 'blur']}],
estimatedFamilyNumbers: [{
required: false,
message: '请输入预计人数(含家属',
message: '请输入成团人数包括家属',
trigger: ['change', 'blur']
}],
lotId: [{required: true, message: '请选择标段时间', trigger: ['change', 'blur']}]
@@ -762,7 +664,8 @@ layout("/layouts/platform.html"){
},
pageForm: {
keywords: null,
year: new Date().getFullYear().toString(),
startYear: '',
endYear: moment().format('YYYY'),
unionId: null,
lineName: null,
travelAgencyId: null
@@ -777,21 +680,11 @@ layout("/layouts/platform.html"){
importVisible: false,
importLoading: false,
importData: {},
isLxyGys: false,
scFilesDrawer: false,
files: [],
modifyConfig:{}
}
},
methods: {
doCopy(row) {
const input = document.createElement('input')
input.value = APP_DOMAIN + FILE_STREAM_PREVIEW_ADDRESS + "?id=" + row.id // 设置复制内容
document.body.appendChild(input) // 添加临时实例
input.select() // 选择实例内容
document.execCommand('Copy') // 执行复制
document.body.removeChild(input) // 删除临时实例
this.$message.success('复制成功!')
},
isShow(roles) {
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')}" === 'true') {
return true
@@ -807,7 +700,6 @@ layout("/layouts/platform.html"){
}
},
async openAdd() {
this.files = []
this.$refs.guava.edit()
this.$nextTick(() => {
if (this.$refs['form']) {
@@ -824,9 +716,9 @@ layout("/layouts/platform.html"){
if (this.config) {
this.formData.minimumGroupSize = this.config.groupNumber
}
await this.getNumber()
},
async openEdit(id) {
this.files = []
const resp = await $.post(loc() + '/selectLineInfoById/' + id)
if (resp.code === 0) {
this.$refs.guava.edit()
@@ -968,21 +860,37 @@ layout("/layouts/platform.html"){
data.append("file", val.raw, val.raw.name);
});
this.importLoading = true
const resp = await $.post(loc() + "/travelLineImport", data)
if (resp.code === 0) {
const resp = await $.post(loc() + "/travelLineImport",data)
if (resp.code === 0){
this.pageData();
this.importVisible = false
} else {
}else {
this.notifyWarning("导入失败")
this.importLoading = false
}
},
handleChangeYear(){
if (this.pageForm.startYear && this.pageForm.endYear){
if (this.pageForm.startYear > this.pageForm.endYear){
this.pageForm.endYear = '';
this.$message.error('起始年份需小于结束年份!');
}
}
},
async getModifyConfig() {
const res = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne')
if (res.code === 0) {
this.modifyConfig = res.data
}
},
async getNumber() {
const resp = await $.post(loc() + '/getNo')
this.formData.serialNumber = resp.data
},
},
async created() {
//如果不是超级管理员,校工会,分工会,就是供应商
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('H03')}" === 'false') {
this.isLxyGys = true
}
await this.getModifyConfig()
this.pageForm.startYear = this.modifyConfig.provinceStartYear+''
await this.initPageData()
this.pageData()
}
@@ -45,7 +45,7 @@ layout("/layouts/platform.html"){
type="year"
value-format="yyyy"
placeholder="选择年"
style="width: 80%" @change="pageData">
style="width: 80%" @change="pageData();getApplyNumAudit()">
</el-date-picker>
</el-col>
<el-col :span="12" v-if="pageForm.lb==='ry'||pageForm.lb===''">
@@ -155,7 +155,7 @@ layout("/layouts/platform.html"){
style="width: 80%" @change="pageData()">
<el-option v-for="item in takePartInLines"
:key="item.id"
:label="item.lineName+''+item.playStartTime1+''+''+item.unionname+''"
:label="item.lineName+''+item.unionname+''"
:value="item.id">
</el-option>
</el-select>
@@ -197,7 +197,8 @@ layout("/layouts/platform.html"){
<el-row v-if="!pageForm.state">
<el-col :span="24" style="color: red;margin-top: 10px">
<span>温馨提醒:当前操作查询是【本工会当年参加疗休养的人员(包含校工会线路)】和【其他工会选择本工会线路的疗休养人员】</span>
<!-- <span>温馨提醒:当前操作查询是【本工会当年参加疗休养的人员(包含校工会线路)】和【其他工会选择本工会线路的疗休养人员】</span>-->
<span>温馨提醒:当前操作查询是【本工会当年参加疗休养的人员(包含校工会线路)】</span>
</el-col>
</el-row>
@@ -230,19 +231,19 @@ layout("/layouts/platform.html"){
<el-card shadow="never" class="mt10">
<table-tool label="" :app="this" ref="table_tool">
<template #label_end>
<el-radio-group size="medium" v-model="pageForm.lb" class="ml10"
<el-radio-group size="small" v-model="pageForm.lb" class="ml10"
@change="pageData()"
v-if="pageForm.state=='1'">
<el-radio-button label="xl">线路列表</el-radio-button>
<el-radio-button label="ry">人员列表</el-radio-button>
</el-radio-group>
<el-radio-group size="medium" v-model="pageForm.lb" class="ml10"
<el-radio-group size="small" v-model="pageForm.lb" class="ml10"
@change="pageData()"
v-if="pageForm.state=='2'">
<el-radio-button label="lxs">旅行社列表</el-radio-button>
<el-radio-button label="ry">人员列表</el-radio-button>
</el-radio-group>
<el-radio-group size="medium" v-model="pageForm.lb" class="ml10"
<el-radio-group size="small" v-model="pageForm.lb" class="ml10"
@change="pageData()"
v-if="pageForm.state=='3'">
<el-radio-button label="jd">酒店列表</el-radio-button>
@@ -252,31 +253,31 @@ layout("/layouts/platform.html"){
style="color: red">当前报名人数有教职工{{applyNum.count1}}人,家属有{{applyNum.count2}}人</span>
</template>
<template #func>
<el-button icon="el-icon-s-promotion" @click="openImport" size="medium"
<el-button icon="el-icon-s-promotion" @click="openImport" size="small"
type="primary">参加人员导入
</el-button>
<!--# if(@shiro.hasRole('H04')){ #-->
<template>
<el-button icon="el-icon-s-promotion"
@click="location.href='/platform/theRapyRecuperation/query/exportDeclareForm'"
size="medium" type="primary">申报表导出
size="small" type="primary">申报表导出
</el-button>
<el-button icon="el-icon-s-promotion"
@click="location.href='/platform/theRapyRecuperation/query/exportTravelers'"
size="medium" type="primary">出行人员导出
size="small" type="primary">出行人员导出
</el-button>
</template>
<!--# } #-->
<el-button icon="el-icon-s-promotion" size="medium" type="primary"
<el-button icon="el-icon-s-promotion" size="small" type="primary"
@click="userDrawer = true"
:disabled="multipleSelection.length==0"
class="mr10" v-if="pageForm.lb=='ry'||!pageForm.lb">设置参加人员
</el-button>
<el-button icon="el-icon-s-promotion" size="medium" type="primary"
<el-button icon="el-icon-s-promotion" size="small" type="primary"
@click="doExport"
class="mr10" v-if="pageForm.state">导出
</el-button>
<el-radio-group @change="pageData()" size="medium"
<el-radio-group @change="pageData()" size="small"
v-model="pageForm.regionalNature"
v-if="pageForm.state=='1'">
<el-radio-button label="">全部</el-radio-button>
@@ -319,15 +320,23 @@ layout("/layouts/platform.html"){
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='isFamily'">
<el-link type="primary" @click="openUser(row)">
<el-link v-if="!row.familyNumber" type="primary" @click="openUser(row)">
{{row.isFamily?'携带':'未携带'}}{{row.isFamily}}
</el-link>
<el-link v-else type="primary">
{{row.familyNumber?'携带':'未携带'}}{{row.familyNumber}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='lineNum'">
<el-link type="primary" @click="openApplyUser(row)">
<el-link v-if="!row.familyNumber" type="primary" @click="openUser(row)">
{{row.lineNum}}{{row.signUpUserFamilyNum}}
</el-link>
<el-link v-else type="primary">
{{row.lineNum}}{{row.familyNumber}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='signUpMode'">
{{signUpModeName(row.signUpMode)}}
@@ -408,23 +417,25 @@ layout("/layouts/platform.html"){
{{row.lotName}}
</template>
</el-table-column>
<el-table-column label="操作" width="150px"
<el-table-column label="操作" width="250px"
v-if="pageForm.lb==='ry'||pageForm.lb===''||pageForm.lb==='xl'">
<template scope="{row}">
<template v-if="pageForm.lb==='xl'">
<el-button @click="openApplyUser(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="doRemind(row)" size="mini" type="primary">
<!--<el-button @click="doRemind(row)" size="mini" type="primary">
提醒
</el-button>
</el-button>-->
</template>
<template v-else>
<el-button @click="openView(row)" size="mini" type="primary"
plain="">查看
<el-button @click="openView(row)" size="mini" type="primary">查看
</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary">编辑
</el-button>
<el-button @click="doDelete(row)" size="mini" type="danger">删除
</el-button>
</template>
</template>
@@ -510,7 +521,13 @@ layout("/layouts/platform.html"){
>
<template scope="{row}" v-if="column.prop=='isFamily'">
{{row.isFamily?'携带':'未携带'}}
<el-link v-if="!row.familyNumber" type="primary">
{{row.isFamily?'携带':'未携带'}}{{row.isFamily}}
</el-link>
<el-link v-else type="primary">
{{row.familyNumber?'携带':'未携带'}}{{row.familyNumber}}
</el-link>
<!--{{row.isFamily?'携带':'未携带'}}-->
</template>
</el-table-column>
<el-table-column label="操作" width="250px">
@@ -642,7 +659,7 @@ layout("/layouts/platform.html"){
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-button size="medium" type=""
<el-button size="small" type=""
@click="location.href='/platform/basics/downloadTemplate?filePath=travel/TravelEnrollImport.xlsx&fileName=参加人员导入模板.xls'"
icon="el-icon-download">下载模板
</el-button>
@@ -663,7 +680,7 @@ layout("/layouts/platform.html"){
:auto-upload="false"
:limit="1"
:file-list="importData.fileList">
<el-button size="medium" type="" icon="el-icon-upload"
<el-button size="small" type="" icon="el-icon-upload"
style="width: 200px">选择文件
</el-button>
<div class="el-upload__tip" slot="tip" style="color: #F56C6C">
@@ -715,6 +732,129 @@ layout("/layouts/platform.html"){
</el-card>
</el-drawer>
<el-dialog
title="修改信息"
:visible.sync="editVisible"
:close-on-click-modal="false"
width="50%">
<el-form :model="editFormData" label-width="120px" :rules="rules" ref="editForm" style="margin-right: 40px">
<el-row>
<el-col span="12">
<el-form-item prop="loginName" label="工号">
<el-input v-model="editFormData.loginName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="姓名">
<el-input v-model="editFormData.userName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="userName" label="手机号">
<el-input v-model="editFormData.mobile" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="身份证号">
<el-input v-model="editFormData.idCard" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="unionName" label="工会">
<el-input v-model="editFormData.unionName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="unitName" label="单位">
<el-input v-model="editFormData.unitName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="prop" :label="labelName">
<template v-if="modifyConfig.familyInfo == 2">
<el-collapse v-model="activeNames">
<el-collapse-item title="点击可展开详细信息" name="1">
<el-card shadow="never">
<el-table :data="editFormData.companionList">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="身份证号" prop="idCard"></el-table-column>
<el-table-column label="年龄" prop="age"></el-table-column>
<el-table-column label="床型" prop="bedType">
<template scope="{row}">
{{ row.bedInfo.bedType }}
</template>
</el-table-column>
<el-table-column label="床位" prop="bedNum">
<template scope="{row}">
{{ row.bedInfo.bedNum }}
</template>
</el-table-column>
<el-table-column label="意向拼床人" prop="otherSleepUser">
<template scope="{row}">
{{ row.bedInfo.otherSleepUser ?
row.bedInfo.otherSleepUser : '暂无' }}
</template>
</el-table-column>
<el-table-column label="关系" prop="relation"></el-table-column>
</el-table>
</el-card>
</el-collapse-item>
</el-collapse>
</template>
<template v-else>
<el-input v-model="editFormData.bedType" readonly></el-input>
</template>
</el-form-item>
<!--<el-form-item prop="travelName" label="旅行社">
<el-select v-model="editFormData.agencyId" filterable clearable
placeholder="请选择旅行社"
style="width: 100%">
<el-option v-for="item in agencyLists"
:key="item.id"
:label="item.travelAgencyName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>-->
<el-form-item prop="travelLine" :label="lineLabelName">
<el-select v-model="editFormData.takePartInLineId" filterable clearable
placeholder="请选择线路"
@change="validateLine"
style="width: 100%">
<el-option v-for="item in unionSelectLines"
:key="item.id"
:label="item.lineName + '-' + item.regionalNature + '【' + item.lotName + '】' + '' + item.playStartTime + '至' + item.playEndTime + '' + '' + item.signUpMode + ''"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="specificTime" label="出行时间" v-if="pageForm.state==='3'">
<el-select v-model="editFormData.specificTime" filterable clearable
placeholder="请选择出行时间"
style="width: 100%">
<el-option v-for="item in editSpecificTimes"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
@@ -731,7 +871,7 @@ layout("/layouts/platform.html"){
options2: [
{label: "本工会人员(自己线路)", value: "1"},
{label: "本工会人员(其他路线)", value: "2"},
{label: "其他工会人员(选我线路)", value: "3"},
// {label: "其他工会人员(选我线路)", value: "3"},
{label: "选择校工会线路人员", value: "4"}
],
jdList: [],
@@ -799,13 +939,103 @@ layout("/layouts/platform.html"){
importVisible: false,
importLoading: false,
importData: {},
editVisible: false,
editFormData: {},
rules: {
loginName: [{required: true, message: '请填写工号', trigger: ['blur', 'change']}],
userName: [{required: true, message: '请填写姓名', trigger: ['blur', 'change']}],
unionName: [{required: true, message: '请选择工会', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '请选择单位', trigger: ['blur', 'change']}],
// travelName: [{required: true, message: '请选择旅行社', trigger: ['blur', 'change']}],
specificTime: [{required: true, message: '请选择出行时间', trigger: ['blur', 'change']}],
// travelLine: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
editSpecificTimes: [],
labelName: '',
unionSelectLines: [],
lineLabelName: '',
activeNames:[]
}
},
components: {
'enroll-info': httpVueLoader('/components/theRapyRecuperation/Enrollinfo.vue'),
'enroll-info': httpVueLoader('/components/theRapyRecuperation/Enrollinfo.vue?v=1.0.1'),
'line-info': httpVueLoader('/components/theRapyRecuperation/LineInfo.vue')
},
methods: {
async validateLine() {
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/validSignUpInfo'
, {enroll: JSON.stringify(this.editFormData)})
if (resp.code !== 0) {
this.$message.warning(resp.msg)
this.editFormData.takePartInLineId = ''
}
},
async doDelete(row) {
this.$confirm("您确定要删除【<span style='color: red'>" + row.userName + "</span>】的此条报名信息吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
dangerouslyUseHTMLString: true,
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/doDeleteMyEnrollInfoById/' + row.id)
if (resp.code === 0) {
await this.doSearch()
this.$message.success('删除成功')
await this.getApplyNumAudit();
} else {
this.$message.warning(resp.msg)
}
}
}
})
},
async doEdit() {
this.$refs['editForm'].validate().then(async () => {
const confirm = await this.$confirm('您确定要修改这位老师的报名信息吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
if (!this.editFormData.takePartInLineId && !this.editFormData.takePartInBaseManagementId) {
this.$message.warning('请选择线路')
return
}
const resp = await $.post('/platform/theRapyRecuperation/user/query/doEdit', this.editFormData)
if (resp.code === 0) {
this.$notify.success(resp.msg)
this.editVisible = false
await this.doSearch();
} else {
this.$notify.error(resp.msg)
}
}
})
},
async openEdit(row) {
this.editFormData = {};
const resp = await $.get("/platform/theRapyRecuperation/TheRapyAudit/findOne", {id: row.id})
if (resp.code === 0) {
this.editFormData = {...resp.data.viewData}
if (this.modifyConfig.familyInfo == 2) {
this.editFormData.companionList = resp.data.viewData.companionList
this.labelName = "家属信息"
} else {
this.editFormData.bedType = resp.data.viewData.familyNumber
this.labelName = "家属数量"
}
}
if (row.takePartInBaseManagementId) {
this.editSpecificTime(row.takePartInBaseManagementId);
this.lineLabelName = "酒店"
} else if (row.takePartInLineId) {
this.lineLabelName = '线路'
}
this.editVisible = true
},
openUser(row) {
this.companionList = row.companionList
this.familyDrawer = true
@@ -1004,7 +1234,7 @@ layout("/layouts/platform.html"){
async openApplyUser(row) {
sublime.showLoadingbar();
const pageForm = clone(this.pageFormUser)
pageForm.id = row.id
pageForm.id = this.pageForm.state === '1' ? row.selectId : row.id
pageForm.unionId = this.unionId
let url = this.pageForm.state === '1' ? '/platform/theRapyRecuperation/line/selectLineUser' : '/platform/theRapyRecuperation/query/selectAgencyUser'
$.post(url, pageForm, (data) => {
@@ -1032,10 +1262,22 @@ layout("/layouts/platform.html"){
}
},
pageOrder1(column) {
async pageOrder1(column) {
this.pageForm.pageOrderName = column.prop;
this.pageForm.pageOrderBy = column.order;
this.getSelfUnionUser();
if (this.pageForm.lb === "") {
this.getSelfUnionUser()
} else if (this.pageForm.lb === "xl") {
await this.getXlData()
} else if (this.pageForm.lb === "lxs") {
this.getLxsData()
await this.getAgencyList()
} else if (this.pageForm.lb === "jd") {
this.getJdData()
await this.getJdList()
} else {
await this.getRyData()
}
},
getSelfUnionUser() {
this.tableLoading = true
@@ -1064,20 +1306,21 @@ layout("/layouts/platform.html"){
{prop: 'regionalNature', label: '线路类型', sortable: true},
{prop: 'isFamily', label: '是否携带家属'},
{prop: 'isTakePartIn', label: '是否参加'},
{prop: 'stateId', label: '审核状态'},
// {prop: 'stateId', label: '审核状态'},
]
this.getSelfUnionUser()
} else if (this.pageForm.lb === "xl") {
this.tableColumns = [
{prop: 'year', label: '年度'},
{prop: 'lineName', label: '线路名称', sortable: true},
{prop: 'times', label: '出行时间'},
// {prop: 'times', label: '出行时间'},
{prop: 'linePlayTime', label: '出行时间'},
{prop: 'travelAgencyName', label: '承担旅行社', sortable: true},
{prop: 'unionname', label: '创建工会', sortable: true},
{prop: 'regionalNature', label: '线路类型', sortable: true},
{prop: 'signUpMode', label: '组织形式', sortable: true},
{prop: 'contact', label: '联系人', sortable: true},
{prop: 'contactMobileNumber', label: '联系方式'},
{prop: 'contact', label: '联系人', sortable: true, checked: 0},
{prop: 'contactMobileNumber', label: '联系方式', checked: 0},
{prop: 'lineNum', label: '报名人数(家属)'}
]
await this.getXlData()
@@ -1118,7 +1361,7 @@ layout("/layouts/platform.html"){
{prop: 'times', label: '出行时间'},
{prop: 'isFamily', label: '是否携带家属'},
{prop: 'isTakePartIn', label: '是否参加'},
{prop: 'stateId', label: '审核状态'},
// {prop: 'stateId', label: '审核状态'},
]
await this.getRyData()
}
@@ -1246,7 +1489,7 @@ layout("/layouts/platform.html"){
this.options2 = [
{label: "本工会人员(自己线路)" + data.count1 + "人", value: "1"},
{label: "本工会人员(其他路线)" + data.count2 + "人", value: "2"},
{label: "其他工会人员(选我线路)" + data.count3 + "人", value: "3"},
// {label: "其他工会人员(选我线路)" + data.count3 + "人", value: "3"},
{label: "选择校工会线路人员" + data.count4 + "人", value: "4"}
]
@@ -1275,11 +1518,11 @@ layout("/layouts/platform.html"){
});
this.importLoading = true
const resp = await $.post('/platform/theRapyRecuperation/user/query/enrollImport',data)
if (resp.code === 0){
const resp = await $.post('/platform/theRapyRecuperation/user/query/enrollImport', data)
if (resp.code === 0) {
await this.pageData();
this.importVisible = false
}else {
} else {
this.notifyWarning("导入失败")
this.importLoading = false
}
@@ -1288,6 +1531,15 @@ layout("/layouts/platform.html"){
this.importVisible = false;
this.pageData();
},
async getUnionSelectLine() {
const resp = await $.post('/platform/theRapyRecuperation/user/query/getUnionSelectLine', {
year: this.pageForm.year,
signUpMode: 1,
})
if (resp.code === 0) {
this.unionSelectLines = resp.data
}
},
},
async created() {
await this.getModifyConfig()
@@ -1311,6 +1563,7 @@ layout("/layouts/platform.html"){
}
}
this.flushUnits()
await this.getUnionSelectLine()
}
})
</script>
@@ -138,12 +138,12 @@ layout("/layouts/platform.html"){
:key="item.value"
:type="item.label"
size="medium"
@click="checkSignUpModeState(item.value)"
@click="checkSignUpModeState(item.value);doSearch()"
style="margin-right: 10px;cursor: pointer;margin-bottom: 5px;"
v-for="item in signUpModeOptions">
{{ item.label }}
</el-tag>
<el-link :underline="false" @click="signUpModeClear"
<el-link :underline="false" @click="signUpModeClear();doSearch()"
type="danger" v-if="signUpModeOptions.length && pageForm.signUpMode">清空
</el-link>
</el-col>
@@ -175,7 +175,7 @@ layout("/layouts/platform.html"){
style="width: 80%" @change="doSearch()">
<el-option v-for="item in takePartInLines"
:key="item.id"
:label="item.lineName+''+item.playStartTime1+''+''+item.unionname+''"
:label="item.lineName+''+item.unionname+''"
:value="item.id">
</el-option>
</el-select>
@@ -217,6 +217,10 @@ layout("/layouts/platform.html"){
<table-tool label="人员列表" :app="this">
<template #func>
<el-button icon="el-icon-s-promotion" size="medium" type="primary"
@click="doExport"
class="mr10" v-if="pageForm.state">导出
</el-button>
<el-button style="margin-right: 10px" @click="openImport" size="medium" type="primary">参加人员导入
</el-button>
<el-button icon="el-icon-s-promotion" size="medium" type="primary"
@@ -264,7 +268,12 @@ layout("/layouts/platform.html"){
</el-link>-->
</template>
<template scope="{row}" v-else-if="column.prop=='isFamily'">
{{row.isFamily?'携带':'未携带'}}{{row.isFamily}}
<el-link v-if="!row.familyNumber" type="primary" @click="openView(row)">
{{row.isFamily?'携带':'未携带'}}{{row.isFamily}}
</el-link>
<el-link v-else type="primary">
{{row.familyNumber?'携带':'未携带'}}{{row.familyNumber}}
</el-link>
</template>
<template scope="{row}" v-else-if="column.prop=='isTakePartIn'">
{{row.isTakePartIn?'已参加':'未参加'}}
@@ -275,10 +284,16 @@ layout("/layouts/platform.html"){
</template>
</el-table-column>
<el-table-column label="操作" width="100px">
<el-table-column label="操作" width="250px">
<template scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看
</el-button>
<!--<el-button
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')}"
@click="openEdit(row)" size="mini" type="primary">编辑
</el-button>-->
<el-button @click="doDelete(row)" size="mini" type="danger">删除
</el-button>
</template>
</el-table-column>
</el-table>
@@ -408,6 +423,142 @@ layout("/layouts/platform.html"){
</el-dialog>
<el-dialog
title="修改信息"
:visible.sync="editVisible"
:close-on-click-modal="false"
width="50%">
<el-form :model="editFormData" label-width="120px" :rules="rules" ref="editForm" style="margin-right: 40px">
<el-row>
<el-col span="12">
<el-form-item prop="loginName" label="工号">
<el-input v-model="editFormData.loginName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="姓名">
<el-input v-model="editFormData.userName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="userName" label="手机号">
<el-input v-model="editFormData.mobile" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="userName" label="身份证号">
<el-input v-model="editFormData.idCard" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col span="12">
<el-form-item prop="unionName" label="工会">
<el-input v-model="editFormData.unionName" readonly></el-input>
</el-form-item>
</el-col>
<el-col span="12">
<el-form-item prop="unitName" label="单位">
<el-input v-model="editFormData.unitName" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item prop="prop" :label="labelName">
<template v-if="modifyConfig.familyInfo == 2">
<el-collapse v-model="activeNames">
<el-collapse-item title="点击可展开详细信息" name="1">
<el-card shadow="never">
<el-table :data="editFormData.companionList">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="身份证号" prop="idCard"></el-table-column>
<el-table-column label="年龄" prop="age"></el-table-column>
<el-table-column label="床型" prop="bedType">
<template scope="{row}">
{{ row.bedInfo.bedType }}
</template>
</el-table-column>
<el-table-column label="床位" prop="bedNum">
<template scope="{row}">
{{ row.bedInfo.bedNum }}
</template>
</el-table-column>
<el-table-column label="意向拼床人" prop="otherSleepUser">
<template scope="{row}">
{{ row.bedInfo.otherSleepUser ?
row.bedInfo.otherSleepUser : '暂无' }}
</template>
</el-table-column>
<el-table-column label="关系" prop="relation"></el-table-column>
</el-table>
</el-card>
</el-collapse-item>
</el-collapse>
</template>
<template v-else>
<el-input v-model="editFormData.bedType" readonly></el-input>
</template>
</el-form-item>
<!--<el-form-item prop="travelName" label="旅行社">
<el-select v-model="editFormData.agencyId" filterable clearable
placeholder="请选择旅行社"
style="width: 100%">
<el-option v-for="item in agencyLists"
:key="item.id"
:label="item.travelAgencyName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>-->
<el-form-item prop="travelLine" :label="lineLabelName">
<div v-if="pageForm.state==='1'">
<el-select v-model="editFormData.takePartInLineId" filterable clearable
placeholder="请选择线路"
@change="validateLine"
style="width: 100%">
<el-option v-for="item in unionSelectLines"
:key="item.id"
:label="item.lineName + '-' + item.regionalNature + '【' + item.lotName + '】' + '' + item.playStartTime + '至' + item.playEndTime + '' + '' + item.signUpMode + ''"
:value="item.id">
</el-option>
</el-select>
</div>
<div v-if="pageForm.state==='3'">
<el-select v-model="editFormData.takePartInBaseManagementId" filterable clearable
placeholder="请选择目的地"
style="width: 100%"
@change="editSpecificTime(editFormData.takePartInBaseManagementId)">
<el-option :key="item.id"
:label="item.baseName +''+item.lotName+''"
:value="item.id"
v-for="item in jdList">
</el-option>
</el-select>
</div>
</el-form-item>
<el-form-item prop="specificTime" label="出行时间" v-if="pageForm.state==='3'">
<el-select v-model="editFormData.specificTime" filterable clearable
placeholder="请选择出行时间"
style="width: 100%">
<el-option v-for="item in editSpecificTimes"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editVisible = false">取 消</el-button>
<el-button type="primary" @click="doEdit">确 定</el-button>
</span>
</el-dialog>
</guava>
</div>
@@ -428,7 +579,7 @@ layout("/layouts/platform.html"){
options: [
{label: "线路", value: "1"},
// {label: "旅行社", value: "2"},
{label: "酒店", value: "3"},
{label: "定点", value: "3"},
],
agencyLists: [],
unionOptions: [],
@@ -444,20 +595,22 @@ layout("/layouts/platform.html"){
{prop: 'playStartTime', label: '出行时间'},
{prop: 'regionalNature', label: '线路类型'},
{prop: 'lotName', label: '标段'},
{prop: 'isFamily', label: '是否携带家属'},
{prop: 'isFamily', label: '是否含随行人'},
{prop: 'signingUptime', label: '报名时间', checked: 0},
{prop: 'isTakePartIn', label: '是否参加'},
{prop: 'takePartInTime', label: '参加时间', checked: 0},
],
pageForm: {
startYear: (moment().format('YYYY') - 2) + '',
startYear: moment().format('YYYY'),
endYear: moment().format('YYYY'),
searchName: "userName",
unionId: '',
agencyId: '',
state: '1',
regionalNature: '',
signUpMode: null
signUpMode: '',
lotId:'',
takePartInLineId:'',
},
multipleSelection: [],
multipleSelection2: [],
@@ -469,13 +622,162 @@ layout("/layouts/platform.html"){
{label: '校工会组织', value: 2},
{label: '分工会组织', value: 1},
],
editVisible: false,
editFormData: {},
rules: {
loginName: [{required: true, message: '请填写工号', trigger: ['blur', 'change']}],
userName: [{required: true, message: '请填写姓名', trigger: ['blur', 'change']}],
unionName: [{required: true, message: '请选择工会', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '请选择单位', trigger: ['blur', 'change']}],
// travelName: [{required: true, message: '请选择旅行社', trigger: ['blur', 'change']}],
specificTime: [{required: true, message: '请选择出行时间', trigger: ['blur', 'change']}],
// travelLine: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
editSpecificTimes: [],
labelName: '',
unionSelectLines: [],
lineLabelName: '',
activeNames:[]
}
},
components: {
'enroll-info': httpVueLoader('/components/theRapyRecuperation/Enrollinfo.vue'),
'enroll-info': httpVueLoader('/components/theRapyRecuperation/Enrollinfo.vue?v=1.0.1'),
'line-info': httpVueLoader('/components/theRapyRecuperation/LineInfo.vue')
},
methods: {
doModify(row){
this.$confirm("您确定要调整【<span style='color: red'>" + row.userName + "</span>】的此条报名信息吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
dangerouslyUseHTMLString: true,
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/doModify/' + row.id)
if (resp.code === 0) {
await this.doSearch()
this.$message.success('调整成功')
}
}
}
})
},
doExport() {
const {
takePartInBaseManagementId,
searchName,
startYear,
endYear,
signUpMode,
searchKeyword,
unionId,
agencyId,
specificTime,
takePartInLineId,
state,
lotId,
linePlayTime,
} = this.pageForm
let types = this.pageForm.state == 1 ? JSON.stringify(['line']) : JSON.stringify(['base'])
window.open(loc() + "/doExport?takePartInBaseManagementId=" + takePartInBaseManagementId +
"&searchName=" + searchName +
"&searchKeyword=" + searchKeyword +
"&startYear=" + startYear +
"&endYear=" + endYear +
"&signUpMode=" + signUpMode +
"&unionId=" + unionId +
"&agencyId=" + agencyId +
"&specificTime=" + specificTime +
"&takePartInLineId=" + takePartInLineId +
"&state=" + state +
"&lotId=" + lotId +
"&satisfyPeople=false" +
"&types=" + types +
"&linePlayTime=" + linePlayTime)
},
async validateLine() {
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/validSignUpInfo'
, {enroll: JSON.stringify(this.editFormData)})
if (resp.code !== 0) {
this.$message.warning(resp.msg)
this.editFormData.takePartInLineId = ''
}
},
async doEdit() {
this.$refs['editForm'].validate().then(async () => {
const confirm = await this.$confirm('您确定要修改这位老师的报名信息吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm === "confirm") {
if (!this.editFormData.takePartInLineId && !this.editFormData.takePartInBaseManagementId) {
this.$message.warning('请选择线路')
return
}
const resp = await $.post('/platform/theRapyRecuperation/user/query/doEdit', this.editFormData)
if (resp.code === 0) {
this.$notify.success(resp.msg)
this.editVisible = false
await this.doSearch();
} else {
this.$notify.error(resp.msg)
}
}
})
},
async openEdit(row) {
this.editFormData = {};
const resp = await $.get("/platform/theRapyRecuperation/TheRapyAudit/findOne", {id: row.id})
if (resp.code === 0) {
this.editFormData = {...resp.data.viewData}
if (this.modifyConfig.familyInfo == 2) {
this.editFormData.companionList = resp.data.viewData.companionList
this.labelName = "家属信息"
} else {
this.editFormData.bedType = resp.data.viewData.familyNumber
this.labelName = "家属数量"
}
}
if (row.takePartInBaseManagementId) {
this.editSpecificTime(row.takePartInBaseManagementId);
this.lineLabelName = "酒店"
} else if (row.takePartInLineId) {
this.lineLabelName = '线路'
}
this.editVisible = true
},
editSpecificTime(id) {
const jd = this.jdList.find(v => v.id === id)
if (jd) {
const lot = this.modifyConfig.lots.find(v => v.id === jd.lotId)
if (lot.lotName === '四晚五天') {
this.editSpecificTimes = this.getTimeByLot1(jd)
} else if (lot.lotName === '两晚三天') {
this.editSpecificTimes = this.getTimeByLot2(jd)
}
}
},
doDelete(row) {
this.$confirm("您确定要删除【<span style='color: red'>" + row.userName + "</span>】的此条报名信息吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
dangerouslyUseHTMLString: true,
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {//确认后再执行
const resp = await $.post('/platform/theRapyRecuperation/line/enroll/doDeleteMyEnrollInfoById/' + row.id)
if (resp.code === 0) {
await this.doSearch()
this.$message.success('删除成功')
}
}
}
})
},
async signUpModeClear() {
this.pageForm.signUpMode = ''
this.takePartInLines = await this.getXlByUnion()
@@ -580,6 +882,7 @@ layout("/layouts/platform.html"){
this.pageForm.pageNumber = 1
this.pageData()
await this.getXlLxsUserCount()
this.takePartInLines = await this.getXlByUnion()
},
async getLines() {
const {data} = await $.post("/platform/theRapyRecuperation/travelAgency/selectLineByAgencyId", {
@@ -604,7 +907,8 @@ layout("/layouts/platform.html"){
async getXlByUnion() {
const {data} = await $.post("/platform/theRapyRecuperation/TheRapyAudit/getXlByUnion", {
unionId: this.pageForm.unionId,
year: this.pageForm.year,
year: this.pageForm.startYear,
endYear: this.pageForm.endYear,
signUpMode: this.pageForm.signUpMode,
})
data.forEach(v => {
@@ -636,7 +940,8 @@ layout("/layouts/platform.html"){
const {data} = await $.post("/platform/theRapyRecuperation/user/query/getXlLxsUserCount", {
unionId: this.pageForm.unionId,
startYear: this.pageForm.startYear,
endYear: this.pageForm.endYear
endYear: this.pageForm.endYear,
signUpMode: this.pageForm.signUpMode
})
this.options.forEach((v, index) => {
if (v.value === "1") {
@@ -679,10 +984,10 @@ layout("/layouts/platform.html"){
processData: false,
contentType: false,
success: (data) => {
if (data.code === 0){
if (data.code === 0) {
this.pageData();
this.importVisible = false
}else {
} else {
this.importLoading = false
}
},
@@ -696,9 +1001,17 @@ layout("/layouts/platform.html"){
this.importVisible = false;
this.pageData();
},
async getUnionSelectLine() {
const resp = await $.post('/platform/theRapyRecuperation/user/query/getUnionSelectLine')
if (resp.code === 0) {
this.unionSelectLines = resp.data
}
},
},
async created() {
await this.getModifyConfig()
await this.getAgencyList()
await this.getUnionSelectLine();
this.unionOptions = await getUnions(null)
this.flushUnits()
await this.getXlLxsUserCount()
@@ -75,6 +75,34 @@ layout("/layouts/platform.html"){
</div>
</div>
<div class="search-item">
<div class="search-item-label">线路类型:</div>
<div class="search-item-option">
<el-radio-group class="mr0-radio"
v-model="pageForm.regionalNature">
<el-radio-button :label="item.value"
border v-for="item in regionalNatureList">
{{item.label}}
</el-radio-button>
</el-radio-group>
</div>
</div>
<div class="search-item">
<div class="search-item-label">时间标段:</div>
<div class="search-item-option">
<el-select @change="doSearch" clearable filterable
style="width: 100%"
v-model="pageForm.lotId">
<el-option :key="item.id"
:label="item.lotName"
:value="item.id"
v-for="item in lotList"
></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
</div>
@@ -119,9 +147,12 @@ layout("/layouts/platform.html"){
</el-switch>
</template>
<template scope="{row}" v-else-if="column.prop==='signUpUserAndFamilyNum'">
<span class="text-primary">
<span class="text-primary" v-if="configData.familyInfo == 2">
{{row.signUpUserNum + row.signUpUserFamilyNum}}
</span>
<span class="text-primary" v-else>
{{row.signUpUserNum + row.familyNumber}}
</span>
</template>
<template scope="{row}" v-else-if="column.prop==='playTime'">
<template v-if="row.playStartTime">{{row.playStartTime + '至' + row.playEndTime}}</template>
@@ -131,7 +162,7 @@ layout("/layouts/platform.html"){
<el-table-column label="操作" width="100px">
<template scope="{row}">
<el-button @click="openViewSignUpUsers(row.id,row.unionId)" size="mini" type="primary">调整
<el-button @click="openViewSignUpUsers(row.usId,row.unionId)" size="mini" type="primary">调整
</el-button>
</template>
</el-table-column>
@@ -153,7 +184,7 @@ layout("/layouts/platform.html"){
<el-table :row-class-name="getRowClassName" :cell-class-name="getColumnClassName"
:data="schoolFreeSignUpUserList" ref="adjustTable">
<el-table-column :selectable="(row)=>{return row.isNormal}" type="selection"></el-table-column>
<el-table-column selectable="" type="selection"></el-table-column>
<el-table-column label="序号" type="expand" width="150px">
<template scope="{row}">
<el-card class="companion_card" shadow="never">
@@ -178,9 +209,12 @@ layout("/layouts/platform.html"){
<el-table-column label="报名时间" prop="signingUptime"></el-table-column>
<el-table-column label="家属人数" prop="companionCount">
<template scope="{row}">
<span class="text-primary">
<span v-if="configData.familyInfo === 2" class="text-primary">
{{row.companionCount}}
</span>
<span v-else class="text-primary">
{{row.familyNumber}}
</span>
</template>
</el-table-column>
<el-table-column label="是否调整" prop="isNormal">
@@ -218,6 +252,8 @@ layout("/layouts/platform.html"){
},
data() {
return {
lotList: [],
regionalNatureList: [],
schoolFreeLineList: [],
pageForm: {
year: new Date().getFullYear().toString(),
@@ -236,7 +272,7 @@ layout("/layouts/platform.html"){
// {label: '组织形式', prop: 'signUpMode', sortable: true},
{label: '创建模式', prop: 'createMode'},
// {label: '报名模式', prop: 'signUpMode'},
{label: '最少成团人数', prop: 'minimumGroupSize'},
{label: '最少参与教工', prop: 'minimumGroupSize'},
{label: '报名人数(含家属)', prop: 'signUpUserAndFamilyNum', width: '150px'},
{label: '是否启用', prop: 'isDisabled', sortable: true}
@@ -244,11 +280,15 @@ layout("/layouts/platform.html"){
schoolFreeSignUpUserList: [],
currentLineId: null,
currentLineSelectUnionId: null,
unionOptions: []
unionOptions: [],
configData: {},
}
},
methods: {
async getLotList() {
const {data} = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne')
this.lotList = data.lots
},
getRowClassName({row, rowIndex}) {
if (row.companionCount === 0) {
return 'row-expand-cover'
@@ -332,20 +372,52 @@ layout("/layouts/platform.html"){
})
if (confirm !== 'confirm') return
const lineId = this.currentLineId
const selection = this.$refs.adjustTable.selection
const loginNames = selection.map(v => v.loginName)
const loginNames = selection.filter(v=>v.isNormal === true).map(v => v.loginName)
if (loginNames.length == 0) {
this.$message.warning('所有教职工已调整,请勿重复勾选')
return
}
const resp = await $.post(loc() + '/adjustmentUser', {lineId, loginNames: JSON.stringify(loginNames)})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
await this.openViewSignUpUsers(this.currentLineId, this.currentLineSelectUnionId)
await this.pageData();
} else {
this.notifyWarning(resp.msg)
}
},
smsAlerts() {
async smsAlerts() {
if (this.$refs.adjustTable.selection.length === 0) {
this.notifyWarning('请选择需要发送短信通知的人员')
return
}
const confirm = await this.$confirm('此操作会向已调整的人员发送短信,您确定要发送短信提醒吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
const lineId = this.currentLineId
const selection = this.$refs.adjustTable.selection
const loginNames = selection.filter(v=>v.isNormal === false).map(v => v.loginName)
if (loginNames.length == 0) {
this.$message.warning('暂无已调整人员,请先进行人员调整')
return
}
const resp = await $.post( loc() + '/smsAlerts',{lineId:lineId,loginNames: JSON.stringify(loginNames)})
if (resp.code === 0) {
this.notifySuccess(resp.msg)
await this.openViewSignUpUsers(this.currentLineId, this.currentLineSelectUnionId)
await this.pageData();
} else {
this.notifyWarning(resp.msg)
}
},
async lineStatusChange(id) {
const resp = await $.post('/platform/theRapyRecuperation/line/openClosedLine/' + id)
@@ -355,12 +427,19 @@ layout("/layouts/platform.html"){
this.notifyWarning(resp.msg)
}
},
async getConfigData() {
const resp = await $.get('/platform/theRapyRecuperation/TheRapyConfig/findOne')
this.configData = resp.data
},
},
async created() {
await this.getConfigData()
this.createModeList = await getEnumOptions('TheRapyRecuperationLineCreateMode')
this.signUpModeList = await getEnumOptions('TheRapyRecuperationSignUpMode')
this.regionalNatureList = await getEnumOptions('TheRapyRecuperationProvinceType')
this.unionOptions = await getUnions(null)
await this.findUnionSignUpModeLineList()
this.lotList = this.getLotList()
await this.pageData()
}
})
@@ -328,7 +328,7 @@ layout("/layouts/platform.html"){
{label: '旅行社名称', prop: 'travelAgencyName', sortable: true},
{label: '线路类型', prop: 'regionalNature', sortable: true},
{label: '出行时间', prop: 'times', sortable: true},
{label: '最少成团人数', prop: 'minimumGroupSize', sortable: true},
{label: '最少参与教工', prop: 'minimumGroupSize', sortable: true},
// {label: '创建工会', prop: 'createUnionName'},
// {label: '创建人', prop: 'createUserName', sortable: true},
// {label: '创建模式', prop: 'createMode'},
@@ -31,6 +31,7 @@ layout("/layouts/platform.html"){
style="width: 100%"
placeholder="选择年度"
type="year"
@change="doSearch"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
@@ -53,6 +54,21 @@ layout("/layouts/platform.html"){
</div>
</div>
<div class="search-item">
<div class="search-item-label">线路类型:</div>
<div class="search-item-option">
<el-radio-group class="mr0-radio"
@change="doSearch"
:disabled = "pageForm.mode == 1"
v-model="pageForm.regionalNature">
<el-radio-button :label="item.value"
border v-for="item in regionalNatureList">
{{item.label}}
</el-radio-button>
</el-radio-group>
</div>
</div>
<div class="search-item">
<div class="search-item-label">线路名称:</div>
<div class="search-item-option">
@@ -98,10 +114,16 @@ layout("/layouts/platform.html"){
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="线路列表">
<table-tool :app="this" label="线路列表(温馨提示:如查询条件的年度为空时,已选择默认查询当年选择的线路)">
<template #func>
<el-radio-group @change="doSearch" size="medium" v-model="pageForm.selectStatus">
<el-radio-button :label="0">全部</el-radio-button>
<el-button @click="showGiveTimes" type="primary"
size="small" style="margin-right: 10px">
一键统赋时间
</el-button>
<el-radio-group @change="doSearch" size="small" v-model="pageForm.selectStatus">
<!--<el-radio-button :label="0">全部</el-radio-button>-->
<el-radio-button :label="1">已选择</el-radio-button>
<el-radio-button :label="-1">可选择</el-radio-button>
</el-radio-group>
@@ -110,8 +132,11 @@ layout("/layouts/platform.html"){
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table"
align="center"
row-key="id"
@selection-change="handleSelectionChange"
header-align="center">
<el-table-column type="selection"></el-table-column>
<el-table-column type="selection" reserve-selection width="55px"
:selectable="(row)=>{return row.isDisabled==true || !(row.usId==null || row.usId == '')}"></el-table-column>
<el-table-column :index="indexMethod" align="center" header-align="center" label="序号" type="index"
width="80px"></el-table-column>
@@ -123,6 +148,7 @@ layout("/layouts/platform.html"){
header-align="center"
:show-overflow-tooltip="column.prop!=='playTime'"
:key="column.prop"
v-if="pageForm.mode != 2 || (pageForm.mode == 2 && column.prop !== 'isOpen')"
v-for="column in tableColumns"
:width="column.width"
>
@@ -142,6 +168,9 @@ layout("/layouts/platform.html"){
<template scope="{row:{createMode}}" v-else-if="column.prop==='createMode'">
{{createModeName(createMode)}}
</template>
<template scope="{row}" v-else-if="column.prop==='belongUnionName'">
{{pageForm.mode == 2 && pageForm.selectStatus == 1 ? '校工会' : row.belongUnionName}}
</template>
<template scope="{row}" v-else-if="column.prop==='playTime'">
<template v-if="row.playTimes">
<!--<el-tooltip placement="top">
@@ -154,11 +183,14 @@ layout("/layouts/platform.html"){
</el-tooltip>-->
<el-tooltip placement="top">
<div slot="content">
<div v-for="(t,ti) in row.playTimes.split(',')" :key="t" :class="[ti==row.playTimes.split(',').length-1?'':'mb10']">
<div v-for="(t,ti) in row.playTimes.split(',')" :key="t"
:class="[ti==row.playTimes.split(',').length-1?'':'mb10']">
{{t}}
</div>
</div>
<div style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis">{{row.playTimes}}</div>
<div style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis">
{{row.playTimes}}
</div>
</el-tooltip>
<!-- <div v-for="t in row.playTimes.split(',')" :key="t">
{{t}}
@@ -175,6 +207,20 @@ layout("/layouts/platform.html"){
<span v-else>{{row.belongUnionName}}</span>
</template>
<template scope="{row}" v-else-if="column.prop==='isOpen'">
<template v-if="row.usId">
<el-switch
@change="doEditOpen(row)"
v-model="row.isOpen"
active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
</template>
<template v-else>
<span>暂未选择</span>
</template>
</template>
</el-table-column>
<el-table-column label="操作" width="100px">
@@ -240,7 +286,11 @@ layout("/layouts/platform.html"){
<el-row class="playPeriod">
<el-descriptions border :column="3" class="playPeriodTable">
<el-descriptions-item label="报名开始时间">
<el-descriptions-item>
<template slot="label">
<span class="text-danger">*</span>
报名开始时间
</template>
<el-form-item :prop="'times.' + $index + '.signUpStartTime'"
:rules="{required:true,message:'报名开始时间',trigger:['change','blur']}"
label-width="0">
@@ -251,19 +301,28 @@ layout("/layouts/platform.html"){
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="报名结束时间">
<el-descriptions-item>
<template slot="label">
<span class="text-danger">*</span>
报名结束时间
</template>
<el-form-item :prop="'times.' + $index + '.signUpEndTime'"
:rules="{required:true,message:'报名结束时间',trigger:['change','blur']}"
label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
@change="doSetChangeTimeByZjxu($index,row.signUpEndTime)"
v-model="row.signUpEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="变更截至时间">
<el-descriptions-item>
<template slot="label">
<span class="text-danger">*</span>
变更截至时间
</template>
<el-form-item :prop="'times.' + $index + '.changeEndTime'"
:rules="{required:true,message:'变更截至时间',trigger:['change','blur']}"
label-width="0">
@@ -275,7 +334,11 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出行开始时间">
<el-descriptions-item>
<template slot="label">
<span class="text-danger">*</span>
出行开始时间
</template>
<el-form-item :prop="'times.' + $index + '.playStartTime'"
:rules="{required:true,message:'出行开始时间',trigger:['change','blur']}"
label-width="0">
@@ -287,7 +350,11 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出行结束时间">
<el-descriptions-item>
<template slot="label">
<span class="text-danger">*</span>
出行结束时间
</template>
<el-form-item :prop="'times.' + $index + '.playEndTime'"
:rules="{required:true,message:'出行结束时间',trigger:['change','blur']}"
label-width="0">
@@ -298,7 +365,11 @@ layout("/layouts/platform.html"){
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系人">
<el-descriptions-item>
<template slot="label">
<span class="text-danger">*</span>
联系人
</template>
<el-form-item :prop="'times.' + $index + '.contact'"
:rules="{required:true,message:'联系人',trigger:['change','blur']}"
label-width="0">
@@ -306,7 +377,11 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="联系方式">
<el-descriptions-item>
<template slot="label">
<span class="text-danger">*</span>
联系方式
</template>
<el-form-item :prop="'times.' + $index + '.contactPhone'"
:rules="[
{ required: true, message: '手机号码不能为空', trigger: 'blur' },
@@ -317,11 +392,11 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="最少成团人数">
<el-descriptions-item label="最少参与教工">
<el-form-item :prop="'times.' + $index + '.minimumGroupSize'"
:rules="[
{ required: true, message: '最少成团人数不能为空', trigger: 'blur' },
{ pattern: /^[0-9]*$/, message: '最少成团人数格式不正确', trigger: 'blur' }
{ required: true, message: '最少参与教工不能为空', trigger: 'blur' },
{ pattern: /^[0-9]*$/, message: '最少参与教工格式不正确', trigger: 'blur' }
]"
label-width="0">
<el-input clearable v-model="row.minimumGroupSize"></el-input>
@@ -345,14 +420,14 @@ layout("/layouts/platform.html"){
</el-descriptions-item>
<el-descriptions-item label="预计人数(含家属">
<el-descriptions-item label="成团人数包括家属">
<el-form-item :prop="'times.' + $index + '.estimatedFamilyNumbers'"
:rules="[
{ required: false, message: '预计人数(含家属不能为空', trigger: 'blur' },
{ pattern: /^[0-9]*$/, message: '预计人数(含家属格式不正确', trigger: 'blur' }
{ required: false, message: '成团人数包括家属不能为空', trigger: 'blur' },
{ pattern: /^[0-9]*$/, message: '成团人数包括家属格式不正确', trigger: 'blur' }
]"
label-width="0">
<el-input clearable v-model="row.estimatedFamilyNumbers"></el-input>
<el-input clearable v-model="row.estimatedFamilyNumbers" placeholder="省外线路人数上限,不限制请忽略"></el-input>
</el-form-item>
</el-descriptions-item>
@@ -430,7 +505,7 @@ layout("/layouts/platform.html"){
{{row.contactPhone}}
</el-descriptions-item>
<el-descriptions-item label="最少成团人数">
<el-descriptions-item label="最少参与教工">
{{row.minimumGroupSize}}
</el-descriptions-item>
@@ -442,7 +517,7 @@ layout("/layouts/platform.html"){
{{row.estimatedCost}}
</el-descriptions-item>
<el-descriptions-item label="预计人数(含家属">
<el-descriptions-item label="成团人数包括家属">
{{row.estimatedFamilyNumbers}}
</el-descriptions-item>
@@ -467,6 +542,103 @@ layout("/layouts/platform.html"){
</div>
</el-dialog>
<el-dialog :close-on-click-modal="false" :visible.sync="setGiveLineTimeDialog" title="统赋出行时间段信息"
width="80%">
<el-form :model="giveLineTimesData" :rules="giveLineTimesRules" label-width="0" ref="giveLineTimesForm"
size="small">
<div v-for="(row,$index) in giveLineTimesData.times" :key="row.id" class="panel panel-default mt20"
style="border: none">
<div class="panel-heading"
style="background: #fafafa;border:1px solid #ebeef5;border-bottom: none;display: flex;align-items: center;justify-content: space-between">
<h3 class="panel-title">
出行时间段
</h3>
</div>
<el-row class="playPeriod">
<el-descriptions border :column="3" class="playPeriodTable">
<el-descriptions-item label="报名开始时间">
<el-form-item :prop="'times.' + $index + '.signUpStartTime'"
:rules="{required:false,message:'报名开始时间',trigger:['change','blur']}"
label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.signUpStartTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="报名结束时间">
<el-form-item :prop="'times.' + $index + '.signUpEndTime'"
:rules="{required:false,message:'报名结束时间',trigger:['change','blur']}"
label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.signUpEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="变更截至时间">
<el-form-item :prop="'times.' + $index + '.changeEndTime'"
:rules="{required:false,message:'变更截至时间',trigger:['change','blur']}"
label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.changeEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出行开始时间">
<el-form-item :prop="'times.' + $index + '.playStartTime'"
:rules="{required:false,message:'出行开始时间',trigger:['change','blur']}"
label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.playStartTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出行结束时间">
<el-form-item :prop="'times.' + $index + '.playEndTime'"
:rules="{required:false,message:'出行结束时间',trigger:['change','blur']}"
label-width="0">
<el-date-picker style="width: 100%"
type="datetime"
v-model="row.playEndTime"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<!--<el-descriptions-item label="是否开启">
<el-form-item :prop="'times.' + $index + '.enable'"
label-width="0">
<el-switch
v-model="row.enable"
:active-value="true"
:inactive-value="false"
active-color="#13ce66"
inactive-color="#ff4949">
</el-switch>
</el-form-item>
</el-descriptions-item>-->
</el-descriptions>
</el-row>
</div>
<el-alert closable show-icon style="margin:10px 0"
title="温馨提醒:变更时间应该大于报名截至时间,小于出行时间。"
type="warning"></el-alert>
</el-form>
<el-row justify="end" type="flex">
<el-button @click="setGiveLineTimeDialog=false">取消</el-button>
<el-button @click="doSetGiveLineTimes" type="primary">提交</el-button>
</el-row>
</el-dialog>
</guava>
</div>
@@ -517,20 +689,59 @@ layout("/layouts/platform.html"){
callback()
}
//统赋时间
const validateGiveSignUpEndTime = (rule, value, callback) => {
console.log(value)
if (!value) {
callback(new Error('请选择报名截至时间'))
}
if (this.giveLineTimesData.signUpStartTime) {
if (Date.parse(value) <= Date.parse(this.giveLineTimesData.signUpStartTime)) {
callback(new Error('报名截至时间必须大于报名开始时间'))
}
}
callback()
}
const validateGiveChangeEndTime = (rule, value, callback) => {
if (!value) {
callback(new Error('请选择变更截至时间'))
}
if (this.giveLineTimesData.signUpEndTime) {
if (Date.parse(value) <= Date.parse(this.giveLineTimesData.signUpEndTime)) {
callback(new Error('变更截至时间必须大于报名截至时间'))
}
}
callback()
}
const validateGivePlayEndTime = (rule, value, callback) => {
if (!value) {
callback(new Error('请选择出行结束时间'))
}
if (this.giveLineTimesData.playStartTime) {
if (Date.parse(value) <= Date.parse(this.giveLineTimesData.playStartTime)) {
callback(new Error('出行结束时间必须大于出行开始时间'))
}
}
callback()
}
return {
tableColumns: [
{label: '年度', prop: 'year', sortable: true},
// {label: '年度', prop: 'year', sortable: true},
{label: '线路名称', prop: 'lineName', sortable: true},
{label: '线路类型', prop: 'regionalNature', sortable: true},
{label: '时间标段', prop: 'lotName', sortable: true, sortProp: 'lotValue'},
{label: '出行时间', prop: 'playTime', sortable: true, sortProp: 'playStartTime', width: 230},
{label: '出行时间', prop: 'playTime', sortable: 'custom', sortProp: 'playStartTime', width: 230},
{label: '承担旅行社', prop: 'travelAgencyName', sortable: true},
// {label: '所属分工会', prop: 'belongUnionName', sortable: true},
{label: '组织形式', prop: 'signUpMode', sortable: true},
// {label: '编号', prop: 'serialNumber', sortable: true},
// {label: '创建模式', prop: 'createMode', sortable: true},
//{label: '创建人', prop: 'createUserName', sortable: true},
{label: '创建工会', prop: 'createUnionName', sortable: true},
{label: '选择工会', prop: 'belongUnionName', sortable: true},
{label: '是否开放对外报名', prop: 'isOpen', sortable: true},
// {label: '是否启用', prop: 'isDisabled', sortable: true}
],
rules: {
@@ -557,9 +768,9 @@ layout("/layouts/platform.html"){
},
pageForm: {
keywords: null,
year: new Date().getFullYear().toString(),
selectStatus: -1,
unionId: null
unionId: null,
regionalNature: '省内'
},
createModeList: [],
signUpModeList: [],
@@ -572,11 +783,60 @@ layout("/layouts/platform.html"){
lineConfig: {
groupNumber: null,
cost: null
}
},
regionalNatureList: [{label:'全部线路',name:'provinceAll',ordinal:0,provinceIn:'provinceIn',provinceOut:'provinceOut',value:'全部'}],
multipleSelection: [],
giveLineTimesData: {
times: []
},
giveLineTimesRules: {
signUpStartTime: [{required: false, message: '请选择报名开始时间', trigger: ['change', 'blur']}],
signUpEndTime: [{
required: false,
validator: validateGiveSignUpEndTime,
trigger: ['change', 'blur']
}],
changeEndTime: [{
required: false,
validator: validateGiveChangeEndTime,
trigger: ['change', 'blur']
}],
playStartTime: [{required: false, message: '请选择出行开始时间', trigger: ['change', 'blur']}],
playEndTime: [{required: false, validator: validateGivePlayEndTime, trigger: ['change', 'blur']}],
},
setGiveLineTimeDialog: false,
}
},
computed: {},
computed: {
computedChangeEndTime() {
return this.formData.times.map(row => ({
...row,
changeEndTime: row.signUpEndTime,
}));
},
},
methods: {
doSearch() {
this.tableData = []
this.tableKey = new Date().getTime()
this.pageForm.pageNumber = 1
this.pageData()
},
pageOrder(column) {
if(column.prop === 'playTime') {
this.pageForm.pageOrderName = 'playStartTime'
} else {
this.pageForm.pageOrderName = column.prop;
}
this.pageForm.pageOrderBy = column.order;
this.pageData();
},
doSetChangeTimeByZjxu(index, value){
this.$set(this.formData.times[index], "changeEndTime", value)
},
async openViewLineInfo({id, usUnionId}) {
this.$refs.guava.view()
this.$refs.viewLineInfo.openView(id, usUnionId)
@@ -585,7 +845,8 @@ layout("/layouts/platform.html"){
const resp = await $.post(loc() + '/selectLineInfo', {
lineId: id,
unionId: usUnionId,
mode: GetQueryString('mode')
mode: GetQueryString('mode'),
year: this.pageForm.year
})
if (resp.code === 0) {
this.timeLots = resp.data
@@ -601,13 +862,22 @@ layout("/layouts/platform.html"){
const resp = await $.post(loc() + '/selectLineInfo', {
lineId: id,
unionId: usUnionId,
mode: GetQueryString('mode')
mode: GetQueryString('mode'),
year: this.pageForm.year
})
if (resp.code === 0 && resp.data) {
this.$set(this.formData, 'times', resp.data)
this.formData = {
times:[]
}
if(resp.data && resp.data.length > 0){
this.$set(this.formData, 'times', resp.data)
}else{
this.formData.times.push({enable:true,minimumGroupSize:this.lineConfig.groupNumber,estimatedCost:this.lineConfig.cost})
}
this.formData.lineId = id
this.formData.signUpMode = signUpMode
this.$set(this.formData, 'lineName', lineName)
this.setLineTimeDialog = true
} else {
this.notifyWarning(resp.msg)
@@ -678,13 +948,82 @@ layout("/layouts/platform.html"){
async getLineConfig(lineId) {
const {data} = await $.post(loc() + '/getLineConfig/' + lineId)
this.lineConfig = data
},
handleSelectionChange(val) {
this.multipleSelection = val;
},
showGiveTimes() {
if (!this.multipleSelection || this.multipleSelection.length == 0) {
this.$message.warning('请在线路列表中勾选您想要统赋时间的线路!');
return
}
this.giveLineTimesData = {
times: [{
signUpStartTime: '',
signUpEndTime: '',
changeEndTime: '',
playStartTime: '',
playEndTime: '',
}]
}
this.setGiveLineTimeDialog = true;
},
async doSetGiveLineTimes() {
const valid = await this.$refs['giveLineTimesForm'].validate()
if (!valid) return
const confirm = await this.$confirm('请再次确认,是否为选择线路统赋时间?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if (confirm !== 'confirm') return
const lineIds = this.multipleSelection.map(v => v.id)
const fmtData = this.giveLineTimesData.times.map(v => {
return {
...v,
signUpMode: this.formData.signUpMode,
mode: GetQueryString('mode')
}
})
const resp = await $.post(loc() + '/setGiveLineTimes', {
lineIds: JSON.stringify(lineIds),
lineUnionSelects: JSON.stringify(fmtData),
year:this.pageForm.year
})
if (resp.code === 0) {
this.setGiveLineTimeDialog = false
this.pageData()
this.$message.success(resp.msg)
this.$refs.table.clearSelection()
} else {
this.$message.warning(resp.msg)
}
},
async doEditOpen(row){
console.log(row)
const resp = await $.get(loc() + '/doEditOpen',{id:row.usId})
if (resp.code === 0){
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
this.pageData()
}
},
async created() {
this.$set(this.pageForm, 'mode', GetQueryString('mode'))
if(this.pageForm.mode == 2) {
this.$set(this.pageForm, 'regionalNature', '全部')
}
this.pageData()
this.createModeList = await getEnumOptions('TheRapyRecuperationLineCreateMode')
this.signUpModeList = await getEnumOptions('TheRapyRecuperationSignUpMode')
this.regionalNatureList.push(...await getEnumOptions('TheRapyRecuperationProvinceType'))
// const result = await getEnumOptions('TheRapyRecuperationProvinceType')
this.unionOptions = await getUnions(null)
this.travelAgencyOptions = this.getTravelAgencyOptions()
this.lotList = this.getLotList()
@@ -695,4 +1034,4 @@ layout("/layouts/platform.html"){
<!--#
}
#-->
#-->
@@ -0,0 +1,505 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.query-row {
height: 70px;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.query-row .el-col {
overflow: hidden;
}
.query-row:not(:last-child) {
border-bottom: 1px dashed rgb(230, 230, 230);
}
.query-row-title {
width: 120px;
}
.el-table-container {
padding-top: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title"></el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="12">
<span>&emsp;&emsp;度:</span>
<el-date-picker
:clearable="false"
v-model="pageForm.startYear"
type="year"
value-format="yyyy"
placeholder="选择年"
style="width: 38%" @change="getUnionSelectLine(); doSearch()">
</el-date-picker>
<span></span>
<el-date-picker
:clearable="false"
v-model="pageForm.endYear"
type="year"
value-format="yyyy"
placeholder="选择年"
style="width: 38%" @change="doSearch">
</el-date-picker>
</el-col>
<el-col :span="12">
<span>所属工会:</span>
<el-select v-model="pageForm.unionId" placeholder="请选择所属工会"
@change="doSearch()"
filterable clearable style="width: 80%">
<el-option
v-for="item in unions"
:key="item.id"
:label="item.unionname"
:value="item.id">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title"></el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="12">
<span>路线类型:</span>
<el-select v-model="pageForm.regionalNature" filterable
placeholder="请选择线路"
style="width: 80%"
@change="lineTypeChange">
<el-option label="全部" value=""></el-option>
<el-option label="省内" value="省内"></el-option>
<el-option label="省外" value="省外"></el-option>
</el-select>
</el-col>
<el-col :span="12">
<span>线&emsp;&emsp;路:</span>
<el-select v-model="pageForm.takePartInLineId" filterable clearable
placeholder="请选择线路"
style="width: 80%" @change="lineChange">
<el-option v-for="item in lineList"
:key="item.id"
:label="item.lineName + '-' + item.regionalNature + '【' + item.lotName + '】' + '' + item.signUpMode + ''"
:value="item.lineId">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row align="middle" class="query-row" type="flex">
<el-col class="query-row-title"></el-col>
<el-col class="query-row-content">
<el-row>
<el-col :span="12">
<span>&emsp;&emsp;段:</span>
<el-select v-model="pageForm.lotId" filterable clearable
placeholder="请选择标段"
style="width: 80%" @change="doSearch()">
<el-option v-for="item in modifyConfig.lots"
:key="item.id"
:label="item.lotName"
:value="item.id">
</el-option>
</el-select>
</el-col>
<el-col :span="12">
<span>出行时间:</span>
<el-select v-model="pageForm.selectId" filterable clearable
placeholder="请选择出行时间"
style="width: 80%" @change="playChange">
<el-option v-for="item in linePlayTimes"
:key="item.times"
:label="item.times"
:value="item.selectId">
</el-option>
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="数据列表" :app="this" ref="table_tool">
<template #func>
<el-button icon="el-icon-s-promotion" size="small" type="primary"
@click="doExport"
class="mr10">导出成团线路人员
</el-button>
</template>
</table-tool>
<el-table :data="tableData" style="width: 100%"
ref="table"
row-key="id" @sort-change="pageOrder"
v-loading="tableLoading">
<el-table-column align="center" header-align="center" type="index" label="序号"
width="80px" key="#index">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:width="column.width"
:sortable="column.sortable"
>
<template scope="{row}" v-if="column.prop=='lineName'">
<el-link type="primary" @click="openLine(row)">{{row.lineName}}
</el-link>
</template>
<template scope="{row}" v-if="column.prop=='signUpMode'">
<span>{{row.signUpMode == '1' ? '校工会组织' : '分工会组织'}}</span>
</template>
<template scope="{row}" v-else-if="column.prop=='lineNum'">
<el-link v-if="!row.familyNumber" type="primary" @click="openUserData(row)">
{{row.lineNum + row.signUpUserFamilyNum}}{{row.signUpUserFamilyNum}}
</el-link>
<el-link v-else type="primary">
{{row.lineNum + row.familyNumber}}{{row.familyNumber}}
</el-link>
</template>
</el-table-column>
<el-table-column label="操作" width="380px">
<template scope="{row}">
<template>
<el-button @click="openUserData(row)" size="mini" type="primary">
查看人员
</el-button>
<el-button size="mini" type="primary" @click="sendSuccess(row)">
发送成团通知
</el-button>
<el-dropdown class="ml10 mr10" trigger="click">
<el-button size="mini" type="primary">
发送未成团通知<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="sendFail(row, true)">保留报名记录</el-dropdown-item>
<el-dropdown-item @click.native="sendFail(row, false)">删除报名记录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<template #public>
<line-info ref="viewLineInfo"></line-info>
</template>
<template #edit>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">工号姓名</div>
<div class="search-item-option">
<el-input v-model="userPageForm.searchKeyword" maxlength="10" clearable></el-input>
</div>
</div>
<div class="search-item"
v-if="${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('SchoolUnionMemberAdmin')}">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select @change="flushUnits" @clear="flushUnits" clearable="true"
filterable="true"
placeholder="所属工会" style="width: 100%;"
v-model="userPageForm.unionId">
<el-option :label="item.unionname" :value="item.id" v-for="item in unions"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属单位:</div>
<div class="search-item-option">
<el-select clearable="true" filterable="true" placeholder="所属单位"
style="width: 100%;"
v-model="userPageForm.unitId">
<el-option :label="item.name" :value="item.id" v-for="item in units"></el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="getUserDataByLineId" icon="el-icon-search" type="primary">搜索</el-button>
</div>
</div>
</el-card>
<el-card shadow="never" class="mt10">
<el-table :data="userData">
<el-table-column
align="center"
header-align="center"
v-for="column in userDataTableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
>
<template scope="{row}" v-if="column.prop=='isFamily'">
<el-link v-if="!row.familyNumber" type="primary">
{{row.isFamily?'携带':'未携带'}}{{row.isFamily}}
</el-link>
<el-link v-else type="primary">
{{row.familyNumber?'携带':'未携带'}}{{row.familyNumber}}
</el-link>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="margin-bottom: 0px">
<el-pagination
@size-change="userPageSizeChange"
@current-change="userPageNumberChange"
:current-page="userPageForm.pageNumber"
:page-sizes="[5,10, 20, 30, 50]"
:page-size="userPageForm.pageSize"
layout="total, sizes, prev, pager, next"
:total="userPageForm.totalCount">
</el-pagination>
</el-row>
</el-card>
</template>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
pageForm: {
startYear: moment().format('YYYY'),
endYear: moment().format('YYYY'),
unionId: '',
regionalNature: '',
signUpMode: '',
lotId: '',
takePartInLineId: '',
selectId: '',
},
linePlayTimes: [],
tableColumns: [
{prop: 'year', label: '年度', width: 60},
{prop: 'lineName', label: '线路名称', sortable: true, width: 200},
{prop: 'linePlayTime', label: '出行时间', width: 180},
{prop: 'travelAgencyName', label: '承担旅行社', sortable: true, width: 180},
{prop: 'unionname', label: '选择线路工会', sortable: true},
{prop: 'regionalNature', label: '线路类型', sortable: true},
{prop: 'contact', label: '联系人', sortable: true, checked: 0},
{prop: 'contactMobileNumber', label: '联系方式', checked: 0},
{prop: 'estimatedFamilyNumbers', label: '最少成团人数', width: 80},
{prop: 'lineNum', label: '报名人数(家属)'},
],
modifyConfig: {},
lineList: [],
unions: [],
units:[],
signUpModeOptions: [
{label: '校工会组织', value: 2},
{label: '分工会组织', value: 1},
],
userPageForm:{
pageNumber:1,
pageSize: 10
},
userData:[],
userDataTableColumns:[
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'unionName', label: '所属工会'},
{prop: 'unitName', label: '所属单位', sortable: true},
{prop: 'isFamily', label: '是否携带家属'},
{prop: 'linePlayTime', label: '出行时间', sortable: true}
],
lineUId: '',
selectLine: {
lineName: '全部'
},
takePartInLines: [],
}
},
components: {
'enroll-info': httpVueLoader('/components/theRapyRecuperation/Enrollinfo.vue?v=1.0.1'),
'line-info': httpVueLoader('/components/theRapyRecuperation/LineInfo.vue')
},
methods: {
doExport() {
const {
startYear,
endYear,
unionId,
takePartInLineId,
lotId,
linePlayTime,
regionalNature,
} = this.pageForm
window.open("/platform/theRapyRecuperation/user/query/doExport?" +
"startYear=" + startYear +
"&endYear=" + endYear +
"&unionId=" + unionId +
"&takePartInLineId=" + takePartInLineId +
"&lotId=" + lotId +
"&regionalNature=" + regionalNature +
"&satisfyPeople=true" +
"&types=" + JSON.stringify(['line']) +
"&linePlayTime=" + linePlayTime)
},
async getLinePlayTimeByLineId(id) {
const resp = await $.get('/platform/theRapyRecuperation/TheRapyXghAudit/getLinePlayTimeByLineId', {
lineId: id,
startYear: this.pageForm.startYear,
endYear: this.pageForm.endYear,
flag: true
})
if (resp.code === 0) {
this.linePlayTimes = resp.data
}
},
async lineChange(val) {
this.pageForm.selectId = ''
await this.getLinePlayTimeByLineId(val);
await this.doSearch()
},
async playChange() {
await this.doSearch()
},
lineTypeChange() {
this.pageForm.takePartInLineId = ''
this.getUnionSelectLine()
this.doSearch()
},
async sendSuccess(row) {
this.$confirm("确定发送<span style='color: red'>成团通知</span>吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(async () => {
const resp = await $.post('/platform/theRapyRecuperation/statistics/sendSuccess', {id: row.lineUId})
if (resp.code === 0) {
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
})
},
sendFail(row, type) {
this.$confirm("确定发送<span style='color: red'>未成团通知</span><span style='color: red'>" + (type ? '保留' : '删除') + "报名记录</span>吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(async () => {
const resp = await $.post('/platform/theRapyRecuperation/statistics/sendFail', {id: row.lineUId, type: type})
if (resp.code === 0) {
this.$message.success(resp.msg)
} else {
this.$message.warning(resp.msg)
}
})
},
openLine(row) {
this.$refs.guava.public()
if (row.regionalNature === "省内") {
this.$refs.viewLineInfo.findOne(row.lineId, null)
} else {
this.$refs.viewLineInfo.findOne(row.lineId, row.usUnionId)
}
},
openUserData(row){
this.lineUId = row.lineUId
this.$refs.guava.edit();
this.getUserDataByLineId(row)
},
async getUnionSelectLine() {
const resp = await $.post('/platform/theRapyRecuperation/user/query/getUnionSelectLine', {
startYear: this.pageForm.startYear,
endYear: this.pageForm.endYear,
signUpMode: this.pageForm.signUpMode,
flag: true,
regionalNature: this.pageForm.regionalNature
})
if (resp.code === 0) {
this.lineList = resp.data
}
},
async getModifyConfig() {
const res = await $.post('/platform/theRapyRecuperation/TheRapyConfig/findOne')
if (res.code === 0) {
this.modifyConfig = res.data
}
},
async flushUnits() {
this.$set(this.userData, "unitId", "")
if ("${@shiro.hasRole('sysadmin')||@shiro.hasRole('A06')||@shiro.hasRole('SchoolUnionMemberAdmin')}" === 'true') {
this.units = await getUnits(this.userData.unionId)
} else {
this.units = await getUnits("${@shiro.getPrincipalProperty('unit').getUnionid()}")
}
},
userPageSizeChange(val) {
this.userPageForm.pageSize = val;
this.getUserDataByLineId();
},
userPageNumberChange(val) {
this.userPageForm.pageNumber = val;
this.getUserDataByLineId();
},
async getUserDataByLineId(row){
this.userPageForm.takePartLineId = this.lineUId
const resp = await $.post(loc() + '/getUserDateByLine',this.userPageForm)
if (resp.code === 0){
this.userData = resp.data.list
this.userPageForm.totalCount = resp.data.totalCount
}
}
},
async created() {
this.unions = await getUnions()
await this.getModifyConfig();
await this.getUnionSelectLine();
this.pageData();
this.flushUnits();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,268 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava :edit_scroll="false" ref="guava">
<template>
<el-card shadow="never">
<div class="search">
<div class="search-item">
<div class="search-item-label">年度:</div>
<div class="search-item-option">
<el-date-picker
:clearable="false"
@change="yearChange"
placeholder="选择年"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</div>
</div>
<div class="search-item">
<div class="search-item-label">线路:</div>
<div class="search-item-option">
<el-select @change="doSearch" filterable="true"
placeholder="请选择线路"
style="width: 100%;" :clearable="true"
v-model="pageForm.lineId">
<el-option :label="item.lineName + '' + item.unionName + ''" :value="item.id"
v-for="item in lineList"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">职工信息:</div>
<div class="search-item-option">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 100%" v-model="pageForm.searchKeyword">
<el-select slot="prepend" style="width: 80px;"
v-model="pageForm.searchName">
<el-option label="姓名" value="we.userName"></el-option>
<el-option label="工号" value="we.loginName"></el-option>
</el-select>
</el-input>
</div>
</div>
<div class="search-item">
<div class="search-item-label">所属工会:</div>
<div class="search-item-option">
<el-select @change="flushUnits" @clear="flushUnits"
clearable
filterable="true"
placeholder="所属工会" style="width: 100%;"
v-model="pageForm.unionId">
<el-option :label="item.unionname" :value="item.id"
v-for="item in unions"></el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">组成单位:</div>
<div class="search-item-option">
<el-select clearable filterable placeholder="请选择"
style="width: 100%"
v-model="pageForm.unitId">
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in units">
</el-option>
</el-select>
</div>
</div>
<div class="search-item">
<div class="search-item-label">评分:</div>
<div class="search-item-option">
<el-select clearable filterable placeholder="请选择"
style="width: 100%"
v-model="pageForm.evaluateScore">
<el-option
:key="item.code"
:label="item.name"
:value="item.code"
v-for="item in evaluateScores">
</el-option>
</el-select>
</div>
</div>
<div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索
</el-button>
</div>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool :app="this" label="评价名单">
<template #func>
<el-button @click="exportEvaluate" size="small" type="primary">导出名单</el-button>
</template>
</table-tool>
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder"
ref="table"
row-key="id" style="width: 100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index"
width="80px"></el-table-column>
<el-table-column
:key="column.prop"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
min-width="100px" show-overflow-tooltip
v-for="column in tableColumns">
</el-table-column>
<el-table-column align="center" header-align="center" label="操作"
prop="userOnline" width="150px">
<template scope="{row}">
<el-button @click="openEvaluate(row)" size="mini" type="primary">查看评价
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
<el-dialog
:close-on-click-modal="false"
:visible.sync="evaluateDialogVisible"
title="评分内容"
width="30%">
<el-form :model="formData" label-width="60px" ref="form">
<el-form-item :rules="[{ required: true, message: ''}]" label="评分">
<!--<div style="position: absolute; top: 20%;">
<el-rate disabled
show-score text-color="#ff9900"
v-model="viewData.evaluateScore"></el-rate>
</div>-->
<span>{{viewData.evaluateScore}}</span>
</el-form-item>
<el-form-item label="评价">
<!--<el-input disabled
maxlength="100"
placeholder="请输入评价"
rows="5"
show-word-limit
type="textarea"
v-model="viewData.evaluateText"
>
</el-input>-->
<span>{{viewData.evaluateText}}</span>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="evaluateDialogVisible = false" type="primary">关 闭</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
unions: [],
units: [],
evaluateDialogVisible: false,
lineList: [],
tableColumns: [
{prop: 'lineName', label: '线路'},
{prop: 'playStartTime', label: '出行时间'},
{prop: 'loginName', label: '工号'},
{prop: 'userName', label: '姓名'},
{prop: 'unitname', label: '单位'},
{prop: 'unionname', label: '工会'},
{prop: 'userState', label: '在职状态'},
{prop: 'personType', label: '人员类型'},
{prop: 'evaluateScore', label: '评分', sortable: true},
{prop: 'evaluateText', label: '评价'},
],
pageForm: {
searchName: "we.userName",
year: new Date().getFullYear().toString(),
lineId: '',
searchKeyword: '',
unionId: '',
unitId: '',
evaluateScore: '',
},
viewData: {},
evaluateScores: [
{name: "满意", code: "满意"},
{name: "一般", code: "一般"},
{name: "不满意", code: "不满意"},
],
}
},
methods: {
exportEvaluate() {
window.open('/platform/therapyRecuperation/evaluate/statistics/exportEvaluate' +
'?lineId=' + this.pageForm.lineId +
'&searchName=' + this.pageForm.searchName +
'&searchKeyword=' + this.pageForm.searchKeyword +
'&unionId=' + this.pageForm.unionId +
'&unitId=' + this.pageForm.unitId +
'&evaluateScore=' + this.pageForm.evaluateScore)
},
openEvaluate(row) {
this.viewData = {
lineId: row.id,
evaluateText: row.evaluateText,
evaluateScore: row.evaluateScore,
}
this.evaluateDialogVisible = true
},
async getLineList() {
const resp = await $.get('/platform/therapyRecuperation/evaluate/statistics/lineList', {year: this.pageForm.year})
this.lineList = resp.data
},
async yearChange() {
this.$set(this.pageForm, "lineId", null)
await this.getLineList()
this.doSearch()
},
async flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.units = []
if (this.pageForm.unionId) {
this.units = await getUnits(this.pageForm.unionId)
}
},
},
async created() {
await this.getLineList()
this.pageData()
this.unions = await getUnions(null, false)
}
})
</script>
<!--#
}
#-->
@@ -12,11 +12,11 @@ layout("/layouts/platform.html"){
padding: 12px 25px;
}
.el-dialog__title {
font-size: 18px; /* 修改标题字体大小 */
color: red; /* 修改标题字体颜色 */
border-bottom: none; /* 去掉标题底部边框线 */
}
/*.el-dialog__title {
font-size: 18px; !* 修改标题字体大小 *!
color: red; !* 修改标题字体颜色 *!
border-bottom: none; !* 去掉标题底部边框线 *!
}*/
</style>
@@ -33,29 +33,61 @@ layout("/layouts/platform.html"){
<el-input v-model="formData.configName" placeholder="请输入配置名称"></el-input>
</el-form-item>
<el-form-item prop="activityGroupId" label="参加人员范围">
<el-select v-model="formData.activityGroupId" placeholder="请选择参加人员范围" filterable
clearable
style="width: 100%">
<el-option v-for="item in activityGroupList"
:value="item.groupId"
:key="item.groupId"
:label="item.groupName"></el-option>
</el-select>
<div style="display: flex; justify-content: space-between">
<div style="width: 99%">
<el-select v-model="formData.activityGroupId" placeholder="请选择参加人员范围" filterable
clearable
style="width: 99%">
<el-option v-for="item in activityGroupList"
:value="item.groupId"
:key="item.groupId"
:label="item.groupName"></el-option>
</el-select>
</div>
<div>
<el-button @click="$refs.drawerUserScope.userScopeDialog = true" type="primary">设置</el-button>
</div>
</div>
</el-form-item>
<el-form-item label="省外名额分配" prop="outsideQuota">
<el-form-item label="省外最多成团人数" prop="outsideQuota">
<el-input v-model.number="formData.outsideQuota"
placeholder="请输入省外名额分配"></el-input>
placeholder="请输入每条省外线路最多成团人数"></el-input>
</el-form-item>
<el-form-item label="省外名额分配比例" prop="outsideQuotaProportion">
<el-slider
show-input
v-model="formData.outsideQuotaProportion">
</el-slider>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="省外名额分配模式" prop="outsideQuotaMode">
<el-radio-group v-model="formData.outsideQuotaMode" size="small">
<el-radio label="fixedRatio" border>固定比例</el-radio>
<el-radio label="unionRatio" border>分工会名额</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<template v-if="formData.outsideQuotaMode == 'fixedRatio'">
<el-col :span="12">
<el-form-item label="省外名额分配比例" prop="outsideQuotaProportion">
<el-input placeholder="请输入省外名额分配比例" v-model="formData.outsideQuotaProportion">
<template slot="append">%</template>
</el-input>
</el-form-item>
</el-col>
</template>
<template v-else-if="formData.outsideQuotaMode == 'unionRatio'">
<el-col :span="12">
<el-form-item label="分工会名额分配" prop="unionLimit">
<el-button @click="doAllocationUnionRatio" type="primary" size="small">点我分配分工会省外名额</el-button>
<template>
<span v-if="formData.unionLimit && formData.unionLimit.length > 0" class="text-success">已分配</span>
<span v-else class="text-danger">未分配</span>
</template>
</el-form-item>
</el-col>
</template>
</el-row>
<el-form-item label="省外几年去一次" prop="outsideNumber">
<el-input max="100"
@@ -69,9 +101,9 @@ layout("/layouts/platform.html"){
v-model.number="formData.travelFrequency"></el-input>
</el-form-item>
<el-form-item label="组团人数" prop="groupNumber">
<el-form-item label="最少教工人数" prop="groupNumber">
<el-input max="100"
placeholder="请输入组团人数"
placeholder="请输入最少教工人数"
v-model.number="formData.groupNumber"></el-input>
</el-form-item>
@@ -113,6 +145,20 @@ layout("/layouts/platform.html"){
v-model.number="formData.provinceStartYear"></el-input>
</el-form-item>
<el-form-item label="床位信息" prop="bedInfo">
<el-radio-group v-model="formData.bedInfo">
<el-radio-button :label="true">需要</el-radio-button>
<el-radio-button :label="false">不需要</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="家属信息" prop="familyInfo">
<el-radio-group v-model="formData.familyInfo">
<el-radio-button :label="1">数量</el-radio-button>
<el-radio-button :label="2">详细信息</el-radio-button>
</el-radio-group>
</el-form-item>
<vi-title title="标段管理"></vi-title>
<el-form-item label="标段">
<el-button type="primary" @click="formData.lots.push({})"
@@ -153,7 +199,8 @@ layout("/layouts/platform.html"){
<vi-title title="服务须知"></vi-title>
<el-form-item label="疗休养服务须知" prop="notice">
<div id="lineContent"></div>
<text-editor v-model="formData.notice"></text-editor>
<!-- <div id="lineContent"></div>-->
</el-form-item>
<el-form-item class="item-button">
@@ -200,12 +247,84 @@ layout("/layouts/platform.html"){
</span>
</el-dialog>
</guava>
<drawer-user-scope
@group_change="getActivityGroup"
ref="drawerUserScope"
:group_id.sync="formData.activityGroupId"
></drawer-user-scope>
<el-dialog :close-on-click-modal="false" :visible.sync="setUpUnionLimitDialog" title="分工会人数限制" top="50px">
<vi-title2 title="分段设置">
<template #func>
<el-button size="small" type="primary" @click="unionLimitQuickSetting">
应用分段设置
</el-button>
</template>
</vi-title2>
<el-row v-for="(item,index) in unionUserNumCalc" :gutter="20" class="mb5">
<el-col :span="7">
<el-input-number v-model="item.startNum" :precision="0" :step="1" :min="1" placeholder="请输入最小人数"
style="width: 100%"></el-input-number>
</el-col>
<el-col :span="7">
<el-input-number v-model="item.endNum" :precision="0" :step="1" :min="1" placeholder="请输入最大人数"
style="width: 100%"></el-input-number>
</el-col>
<el-col :span="6">
<el-input-number v-model="item.resultNum" :precision="0" :step="1" :min="1" placeholder="请输入限制人数"
style="width: 100%"></el-input-number>
</el-col>
<el-col :span="4" class="text-right">
<el-button icon="el-icon-plus" @click="unionUserNumCalc.push({})"></el-button>
<el-button icon="el-icon-minus" @click="unionUserNumCalc.splice(index,1)"
:disabled="unionUserNumCalc.length===1"></el-button>
</el-col>
</el-row>
<el-row class="mt10">
<div v-for="(item,index) in unionUserNumCalcTips" class="text-danger">
<span class="mr10">({{index+1}}).</span> {{item}}
</div>
</el-row>
<vi-title2 title="比例设置" class="mt20">
<template #func>
一键比例:
<el-input-number v-model="unionUserNumOneKeyRatio" :precision="0" :step="1" :min="0"
placeholder="请输入一键比例"
size="small"
:max="100"></el-input-number>
<el-button size="small" type="primary" @click="applyScaleSettings" class="ml5">应用比例设置</el-button>
</template>
</vi-title2>
<el-table :data="formData.unionLimit" max-height="500px">
<el-table-column prop="unionname" label="分工会"></el-table-column>
<el-table-column prop="teacherCount" label="人数"></el-table-column>
<el-table-column prop="ratio" label="比例(%)">
<template scope="{row}">
<el-input-number v-model="row.ratio" :precision="0" :step="1" :min="0" :max="100"></el-input-number>
</template>
</el-table-column>
<el-table-column prop="limitCount" label="限制人数">
<template scope="{row}">
<el-input-number v-model="row.limitCount" :precision="0" :step="1" :min="0"
:max="row.teacherCount" @change="calSummaryCount"></el-input-number>
</template>
</el-table-column>
</el-table>
<el-row class="mt20" justify="end" type="flex">
<div class="text-danger" style="width: 100%;font-size: 18px;display: flex;align-items: center;font-weight: bold">限制总人数:{{summaryCount}}人</div>
<el-button @click="clearUnionLimit" type="danger">清空分工会人数限制</el-button>
<el-button @click="setUpUnionLimitDialog=false">取消</el-button>
<el-button @click="doConfirmSetUpUnionLimit" type="primary">确定</el-button>
</el-row>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
activityGroupList: [],
@@ -225,6 +344,9 @@ layout("/layouts/platform.html"){
allLineSignUpNumber: null,
notice: null,
provinceStartYear: null,
bedInfo: true,
familyInfo: 1,
unionLimit: []
},
formRules: {
configName: [{required: true, message: '请填写配置名称', trigger: ['blur', 'change']}],
@@ -232,7 +354,7 @@ layout("/layouts/platform.html"){
isSwLine: [{required: true, message: '请选择省外线路是否需要审核', trigger: ['blur', 'change']}],
outsideQuota: [{
required: true,
message: '请填写省外名额分配',
message: '请输入每条省外线路最多成团人数',
trigger: ['blur', 'change']
}],
outsideNumber: [{
@@ -247,7 +369,7 @@ layout("/layouts/platform.html"){
}],
groupNumber: [{
required: true,
message: '请填写组团人数',
message: '请填写最少教工人数',
trigger: ['blur', 'change']
}],
modifyDays: [{
@@ -272,6 +394,8 @@ layout("/layouts/platform.html"){
}],
notice: [{required: true, message: '请输入详细内容', trigger: ['change', 'blur']}],
provinceStartYear: [{required: true, message: '请输入省内起始年份', trigger: ['change', 'blur']}],
bedInfo: [{required: true, message: '请选择床位信息', trigger: ['change', 'blur']}],
familyInfo: [{required: true, message: '请选择家属信息', trigger: ['change', 'blur']}],
},
marks: [],
@@ -280,9 +404,100 @@ layout("/layouts/platform.html"){
centerDialogVisible:false,
tableScopeId:'',
tableScopeIndex:'',
userScopeDialog: false,
// 分配分工会省外线路的比例相关
setUpUnionLimitDialog: false,
unionUserNumCalc: [{}],
unionUserNumOneKeyRatio: null,
summaryCount: 0,
}
},
components: {
'drawer-user-scope': httpVueLoader('/components/plugins/DrawerUserScope.vue?v=1.0.1'),
},
methods: {
// 设置分工会比例相关==============================================start
async doAllocationUnionRatio(){
this.setUpUnionLimitDialog = true
if (!this.formData.unionLimit || this.formData.unionLimit.length === 0) {
const resp = await $.get('/platform/trainSingUp/manage/activity/add/getUnionLimit', {activityScopeId: this.formData.activityGroupId})
if (resp.code === 0) {
this.$set(this.formData, 'unionLimit', resp.data)
}
}
this.calSummaryCount()
// this.summaryCount = this.formData.unionLimit.reduce((prev, curr) => {
// console.log(curr)
// const value = Number(curr.limitCount);
// if (!isNaN(value)) {
// return prev + curr.limitCount;
// } else {
// return prev;
// }
// }, 0)
},
unionLimitQuickSetting() {
this.unionUserNumCalc.forEach((v, i) => {
const startNum = v.startNum
const endNum = v.endNum
const resultNum = v.resultNum
if (startNum > endNum) {
this.$message.warning('第' + (i + 1) + '行设置错误')
} else {
this.formData.unionLimit.forEach(x => {
if (x.teacherCount >= startNum && x.teacherCount <= endNum) {
x.limitCount = resultNum
}
})
this.calSummaryCount()
}
})
},
applyScaleSettings() {
this.formData.unionLimit.forEach(v => {
v.limitCount = parseFloat((v.teacherCount * this.unionUserNumOneKeyRatio / 100).toFixed(0))
if (v.ratio) {
v.limitCount = parseFloat((v.teacherCount * v.ratio / 100).toFixed(0))
}
})
this.calSummaryCount()
},
calSummaryCount() {
const array = this.formData.unionLimit
if (array) {
this.summaryCount = array.reduce((prev, curr) => {
const value = Number(curr.limitCount);
if (!isNaN(value)) {
return prev + curr.limitCount;
} else {
return prev;
}
}, 0)
}
},
async clearUnionLimit() {
const confirm = await this.$confirm('确定要清空分工会人数限制吗, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' === confirm) {
this.formData.unionLimit = []
this.unionUserNumOneKeyRatio = null
this.unionUserNumCalc = [{}]
this.setUpUnionLimitDialog = false
}
},
doConfirmSetUpUnionLimit() {
this.setUpUnionLimitDialog = false
/*if (this.formData.unionLimit) {
const totalLimit = this.formData.unionLimit.map(v => v.limitCount).reduce((a, b) => a + b)
console.log(totalLimit)
this.formData.coursePeopleNumber = totalLimit
}*/
},
// 设置分工会省外比例相关结束==============================================end
async deleteLotsRow(scope) {
//this.lotDeleteList.push(scope.row.id);
//console.log(this.lotDeleteList)
@@ -309,6 +524,7 @@ layout("/layouts/platform.html"){
},
resetForm() {
this.formData.lots = []
this.formData.unionLimit = []
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
@@ -331,6 +547,9 @@ layout("/layouts/platform.html"){
if (this.formData.lots && this.formData.lots.length > 0) {
cloneData.lots = JSON.stringify(this.formData.lots)
}
if (this.formData.unionLimit && this.formData.unionLimit.length > 0) {
cloneData.unionLimit = JSON.stringify(this.formData.unionLimit)
}
cloneData.outsideQuotaProportion = cloneData.outsideQuotaProportion / 100
const resp = await $.post(loc() + "/operation", cloneData)
if (resp.code === 0){
@@ -353,24 +572,24 @@ layout("/layouts/platform.html"){
data.lots = []
}
this.formData = data
this.initLineContentEditor(data.notice)
// this.initLineContentEditor(data.notice)
},
async getActivityGroup() {
const {data} = await $.get('/platform/activity/basic/scope/getActivityUserScopeGroup')
this.activityGroupList = data
},
initLineContentEditor(content) {
$("#lineContent").html("")
lineContentEditor = new wangEditor("#lineContent")
lineContentEditor.config.onchange = (html) => {
this.formData.notice = html.replace(/<p\><\/p>/g, '')
}
lineContentEditor.config.uploadImgShowBase64 = true
lineContentEditor.create()
if (content) {
lineContentEditor.txt.html(content)
}
},
// initLineContentEditor(content) {
// $("#lineContent").html("")
// lineContentEditor = new wangEditor("#lineContent")
// lineContentEditor.config.onchange = (html) => {
// this.formData.notice = html.replace(/<p\><\/p>/g, '')
// }
// lineContentEditor.config.uploadImgShowBase64 = true
// lineContentEditor.create()
// if (content) {
// lineContentEditor.txt.html(content)
// }
// },
async closeDialog() {
this.tableScopeIndex = '';
this.tableScopeId = '';
@@ -396,10 +615,26 @@ layout("/layouts/platform.html"){
}
}
},
computed: {
unionUserNumCalcTips() {
return this.unionUserNumCalc.map(v => {
return (v.startNum ? v.startNum : '?') + '-' + (v.endNum ? v.endNum : '?') + '人的分工会,限报' + (v.resultNum ? v.resultNum : '?') + '人'
})
},
},
async created() {
this.findOne();
this.initLineContentEditor();
}
// this.initLineContentEditor();
},
watch: {
'formData.activityGroupId': {
async handler(newVal, oldVal) {
this.activityGroupList = await getActivityGroup()
this.userScopeDialog = false
},
deep: true
},
},
})
</script>
@@ -245,7 +245,6 @@ layout("/layouts/platform.html"){
</el-row>
<el-card shadow="never" class="mt10">
<table-tool :label="trainType + '信息'" :app="this">
<template #label_end>
<div class="search-item-option">
@@ -513,14 +512,13 @@ layout("/layouts/platform.html"){
activityList: [],
courseTypeList: [],
tableColumns: [
{prop: 'courseName', label: '名称', width: '250px'},
{prop: 'lxname', label: '类型', width: '70px'},
{prop: 'assort', label: '标识', width: '150px'},
// {prop: 'coursePeopleNumber', label: '总人数', width: '80px'},
{prop: 'courseLocationCoordinates', label: '地点'},
{prop: 'courseInstructor', label: '联系人'},
{prop: 'courseTime', label: '时间', width: '200px'},
{prop: 'applyNum', label: '已报名人数'},
{ prop: "courseName", label: "名称" },
{ prop: "lxname", label: "类型" },
{ prop: "coursePeopleNumber", label: "总人数" },
{ prop: "courseLocationCoordinates", label: "地点" },
{ prop: "courseInstructor", label: "联系人" },
{ prop: "courseTime", label: "时间" },
{ prop: "applyNum", label: "已报名人数" }
],
viewMapDialog: false,
courseTimeListDialog: false,
@@ -550,7 +550,6 @@ layout("/layouts/platform.html"){
}
},
openAudit({hisId, id}) {
debugger
this.$refs.userChangeHistory.openUserChangeInfo(hisId)
this.$refs.userChangeHistory.slot = true
@@ -31,7 +31,7 @@ layout("/layouts/platform.html"){
}
.desc_label {
width: 75px;
/*width: 75px;*/
-webkit-flex-shrink: 0;
flex-shrink: 0;
padding-right: 4px;
@@ -232,9 +232,10 @@ layout("/layouts/platform.html"){
<div style="white-space: normal; display: flex">
<span class="desc_label"></span>
<el-tooltip placement="top" :content="option.supplier">
<!-- style="width: calc(100% - 80px);text-overflow: ellipsis;overflow: hidden;overflow-y: auto;height: 100px;" -->
<span
class="desc_value"
style="width: calc(100% - 80px);text-overflow: ellipsis;overflow: hidden;overflow-y: auto;height: 100px;"
style="text-overflow: ellipsis;overflow: hidden;overflow-y: auto;height: 100px;"
>
{{ option.supplier }}
</span>
@@ -691,10 +692,10 @@ layout("/layouts/platform.html"){
for (const option of options) {
// 检查是否有 specs
if (option.specs) {
if (option.specs && option.specs.length > 0) {
// 检查 selectSpecs 是否为空或未定义
if (!option.selectSpecs) {
this.$toast.fail('请选择' + option.optionName + '的规格')
this.$message.warning('请选择' + option.optionName + '的规格')
return
}
}
@@ -721,14 +722,14 @@ layout("/layouts/platform.html"){
})
if (code === 0) {
this.$message.success('您已完成本次福利选择。')
this.doSearch()
this.$refs.guava.index()
} else {
this.$message({
message: msg,
type: 'warning'
});
}
this.doSearch()
this.$refs.guava.index()
}
})
},