Merge remote-tracking branch 'origin/main'

This commit is contained in:
2025-11-06 15:15:24 +08:00
24 changed files with 4266 additions and 410 deletions

View File

@@ -44,6 +44,13 @@ export function returnPerson(params) {
method: 'get', method: 'get',
'url': `/personnel/personBaseInfo/returnPerson`, 'url': `/personnel/personBaseInfo/returnPerson`,
params
})
}
export function getStatistic(params) {
return request({
method: 'get',
'url': `/pc/index/fwqkfx`,
params params
}) })
} }

View File

@@ -26,38 +26,103 @@
</view> </view>
</template> </template>
<scroll-view scroll-y class="main-scroll" @scrolltolower="handleScrollToLower"> <scroll-view scroll-y class="main-scroll" @scrolltolower="handleScrollToLower">
<div class="cards"> <div class="cards" v-for="(item,index) in dataList">
<div class="cardHead"> <div class="cardHead">
<div class="cardHeadLeft"> <div class="cardHeadLeft">
<div class="cardTitle">2025年注册会计师证</div> <div class="cardTitle">{{item.name}}</div>
<div class="titleType primary">未开始</div> <div class="titleType success" v-if="item.score">已完成</div>
<div class="titleType info" v-else-if="dates<item.startDate">未开始</div>
<div class="titleType primary" v-else-if="(dates>item.startDate||dates==item.startDate)&&dates<item.dueDate">
进行中
</div>
<div class="titleType info" v-else-if="dates>item.dueDate">已过期</div>
</div> </div>
<div class="rightBtn">立即练习</div> <div class="rightBtn" v-if="(dates>item.startDate||dates==item.startDate)&&dates<item.dueDate&&item.isContinue!=1">开始考试</div>
<div class="rightBtn" v-if="(dates>item.startDate||dates==item.startDate)&&dates<item.dueDate&&item.isContinue==1">继续考试</div>
</div> </div>
<div class="heng"></div> <div class="heng"></div>
<div class="cardCon"> <div class="cardCon">
<div class="conten">考试时长120分钟</div> <div class="conten">考试时长{{item.timeLimit}}分钟</div>
<div class="conten">题目数量88</div> <div class="conten">题目数量{{item.totalQuestions}}</div>
<div class="conten">及格分数60</div> <div class="conten">分类
<div class="conten">截止日期2025-12-31</div> <span v-for="(val, key) in classification">
<template v-if="item.category==val.dictValue">{{ val.dictLabel }}</template>
</span>
</div>
<div class="conten">成绩
<span v-if="item.gradeUser" >{{ item.gradeUser.score }}</span>
<span v-else>--</span>
</div>
<div class="conten">开始时间{{item.startDate}}</div>
<div class="conten">截止时间{{item.dueDate}}</div>
</div> </div>
<div class="flooter"> <div class="flooter">
<div @click="jumps('/packageB/train/mockExam/viewGrades')">查看成绩</div> <div v-if="item.gradeUser" @click="jumps('/packageB/train/mockExam/viewGrades')">查看成绩</div>
<div>详情</div> <div @click="handleDetail(item)">详情</div>
<div>收藏</div> <div @click="collects(item,1)" v-if="item.isCollect==0">
<image :src="urls+'wsc.png'" mode="" style="width: 32rpx;height: 30rpx;"></image>
收藏
</div>
<div v-else @click="collects(item,0)">
<image :src="urls+'video-sc.png'" mode="" style="width: 32rpx;height: 30rpx;"></image>
取消
</div>
</div> </div>
</div> </div>
<div class="cards"></div>
<div class="cards"></div>
</scroll-view> </scroll-view>
</div> </div>
<div class="cards2" v-if="dialogVisible"> <div class="cards2" v-if="dialogVisible">
<div class="cardCon"> <div class="cardCon">
<div class="cardHead"> <div class="cardHead" style="margin-bottom: 20rpx;">
<div></div> <div>{{examInfo.name}}</div>
<div style="font-size: 40rpx;" @click="clones()">×</div> <div style="font-size: 40rpx;" @click="clones()">×</div>
</div> </div>
<div class="status-tags">
<div class="titleType success" v-if="examInfo.score">已完成</div>
<div class="titleType info" v-else-if="dates<examInfo.startDate">未开始</div>
<div class="titleType primary" v-else-if="(dates>examInfo.startDate||dates==examInfo.startDate)&&dates<examInfo.dueDate">
进行中
</div>
<div class="titleType info" v-else-if="dates>examInfo.dueDate">已过期</div>
<div class="titleType success" v-if="examInfo.difficulty=='easy'">初级</div>
<div class="titleType tertiary" v-if="examInfo.difficulty=='medium'">中级</div>
<div class="titleType primary2" v-if="examInfo.difficulty=='hard'">高级</div>
</div>
<div class="detailTitle">考试简介</div>
<div class="detailCon">{{ examInfo.description }}</div>
<div class="exam-info">
<div class="info-item">
<div class="info-value">{{ examInfo.timeLimit }}</div>
<div class="info-label">考试时长</div>
<div class="info-label">(分钟)</div>
</div>
<div class="info-divider"></div>
<div class="info-item">
<div class="info-value">{{ examInfo.totalQuestions }}</div>
<div class="info-label">题目总数</div>
</div>
<div class="info-divider"></div>
<div class="info-item">
<div class="info-value">{{ examInfo.passScore }}</div>
<div class="info-label">及格分数</div>
</div>
<div class="info-divider"></div>
<div class="info-item">
<div class="info-value">{{ examInfo.totalScore }}</div>
<div class="info-label">总分</div>
</div>
</div>
<div class="detailTitle">考试要求</div>
<div class="detailCon">考试过程中请勿刷新页面或关闭浏览器</div>
<div class="detailCon">请在规定时间内完成所有题目</div>
<div class="detailCon">考试开始后不可暂停请确保网络连接稳定</div>
<div class="detailCon">考试结束后可查看成绩和答案解析</div>
<div style="display: flex;justify-content: center;margin-top: 30rpx;">
<div class="rightBtn" v-if="(dates>examInfo.startDate||dates==examInfo.startDate)&&dates<examInfo.dueDate&&examInfo.isContinue!=1">开始考试</div>
<div class="rightBtn" v-if="(dates>examInfo.startDate||dates==examInfo.startDate)&&dates<examInfo.dueDate&&examInfo.isContinue==1">继续考试</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -66,22 +131,138 @@
<script setup> <script setup>
import { inject, ref, reactive } from 'vue'; import { inject, ref, reactive } from 'vue';
import { onLoad } from '@dcloudio/uni-app'; import { onLoad } from '@dcloudio/uni-app';
const { $api, navTo, navBack } = inject('globalFunction'); const { $api, navTo, navBack,urls } = inject('globalFunction');
import config from "@/config.js" import config from "@/config.js"
const userInfo = ref({});
const Authorization = ref('');
const searchKeyword = ref(''); const searchKeyword = ref('');
const pageState = reactive({ const dataList=ref([])
page: 0, const pageSize=ref(10)
list: [], const pageNum=ref(1)
total: 0, const totalNum=ref(0)
maxPage: 1, const dates=ref('')
pageSize: 12, const classification=ref([])
search: {}, const levalLabels=ref([])
}); const examInfo = ref({})
const baseUrl = config.imgBaseUrl const baseUrl = config.imgBaseUrl
const dialogVisible = ref(false); const dialogVisible = ref(false);
const handleScrollToLower = () => { const handleScrollToLower = () => {
}; };
onLoad(() => {
getDictionary()
const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1; // 月份从0开始需要加1
let day = date.getDate();
month=month>9?month:'0'+month
day=day>9?day:'0'+day
dates.value=year+'-'+month+'-'+day
Authorization.value=uni.getStorageSync('Padmin-Token')||''
getHeart();
});
function getHeart() {
const raw =Authorization.value;
const token = typeof raw === "string" ? raw.trim() : "";
const headers = token ? { 'Authorization': raw.startsWith("Bearer ") ? raw : `Bearer ${token}` }: {}
$api.myRequest("/dashboard/auth/heart", {}, "POST", 10100, headers).then((resData) => {
if (resData.code == 200) {
getUserInfo();
} else {
navTo('/packageB/login')
}
});
};
function getUserInfo(){
let header={
'Authorization':Authorization.value
}
$api.myRequest('/system/user/login/user/info', {},'get',10100,header).then((resData) => {
userInfo.value = resData.info || {};
getDataList('refresh');
});
};
function getDictionary(){
$api.myRequest('/system/public/dict/data/type/question_classification', {},'get',9100).then((resData) => {
classification.value=resData.data
});
$api.myRequest('/system/public/dict/data/type/question_level', {},'get',9100).then((resData) => {
levalLabels.value=resData.data
});
}
// 搜索视频
function searchVideo() {
getDataList('refresh');
}
// 清除搜索内容
function clearSearch() {
searchKeyword.value = '';
getDataList('refresh');
}
// 获取考试列表
function getDataList(type = 'add') {
let maxPage=Math.ceil(totalNum.value/pageSize.value)
let params={}
if (type === 'refresh') {
pageNum.value = 1;
params={
name:searchKeyword.value,
pageSize:pageSize.value,
pageNum:pageNum.value,
userId:userInfo.value.userId
}
$api.myRequest('/train/public/trainExamDash/getExamPublishTable', params).then((resData) => {
if(resData.code==200){
dataList.value=resData.rows
totalNum.value=resData.total
}
});
}
if (type === 'add' && pageNum.value < maxPage) {
pageNum.value += 1;
params={
name:searchKeyword.value,
pageSize:pageSize.value,
pageNum:pageNum.value,
userId:userInfo.value.userId
}
$api.myRequest('/train/public/trainExamDash/getExamPublishTable', params).then((resData) => {
if(resData.code==200){
dataList.value=dataList.value.concat(resData.rows)
totalNum.value=resData.total
}
});
}
}
function collects(row,i){
$api.myRequest('/train/public/examUser/addOrUpdateExamUser', {
userId:userInfo.value.userId,
examPaperId:row.examPaperId,
collect:i,
}).then((resData) => {
if(resData.code==200){
if(i==1){
$api.msg('收藏成功',2000)
}else{
$api.msg('已取消收藏',2000)
}
getDataList('refresh');
}
});
}
function handleDetail(row){
$api.myRequest('/train/public/trainExamDash/getExamPublishModel', {
userId:userInfo.value.userId,
examPaperId:row.examPaperId,
}).then((resData) => {
if(resData&&resData.code==200){
examInfo.value=resData.data
dialogVisible.value=true;
}
});
}
function jumps(url){ function jumps(url){
navTo(url); navTo(url);
} }
@@ -149,10 +330,10 @@ function clones(){
} }
.main-scroll { .main-scroll {
width: 100%; width: 100%;
height: 100%; height: 90%;
.cards{ .cards{
width: 100%; width: 100%;
height: 260rpx; height: 280rpx;
background: linear-gradient(0deg, #E3EFFF 0%, #FBFDFF 100%); background: linear-gradient(0deg, #E3EFFF 0%, #FBFDFF 100%);
// box-shadow: 0px 0px 6px 0px rgba(0,71,200,0.32); // box-shadow: 0px 0px 6px 0px rgba(0,71,200,0.32);
border-radius: 12rpx; border-radius: 12rpx;
@@ -187,35 +368,15 @@ function clones(){
line-height: 38rpx; line-height: 38rpx;
margin-left: 10rpx; margin-left: 10rpx;
} }
.primary{
border: 1px solid #157EFF;
color: #157EFF
}
.success{
border: 1px solid #05A636;
color: #05A636
}
.info{
border: 1px solid #898989;
color: #898989
}
}
.rightBtn{
width: 140rpx;
height: 44rpx;
line-height: 44rpx;
background: linear-gradient(90deg, #00C0FA 0%, #1271FF 100%);
border-radius: 4px;
color: #fff;
font-size: 24rpx;
text-align: center
} }
} }
.heng{ .heng{
width: 120rpx; width: 120rpx;
height: 4rpx; height: 4rpx;
background: linear-gradient(88deg, #015EEA 0%, #00C0FA 100%); background: linear-gradient(88deg, #015EEA 0%, #00C0FA 100%);
margin: 10rpx 0 30rpx; margin: 10rpx 0 20rpx;
} }
.cardCon{ .cardCon{
display: flex; display: flex;
@@ -226,7 +387,11 @@ function clones(){
color: #666666; color: #666666;
display: flex; display: flex;
align-items: center align-items: center
margin-bottom: 20rpx; margin-bottom: 10rpx;
}
.status-tags{
display: flex;
align-items: center;
} }
} }
.flooter{ .flooter{
@@ -238,6 +403,7 @@ function clones(){
font-size: 28rpx; font-size: 28rpx;
margin-left: 30rpx; margin-left: 30rpx;
color: #2175F3; color: #2175F3;
padding-top: 14rpx;
} }
} }
} }
@@ -254,7 +420,7 @@ function clones(){
padding: 100rpx 50rpx; padding: 100rpx 50rpx;
box-sizing: border-box; box-sizing: border-box;
.cardCon{ .cardCon{
height: 100%; height: 70%;
background-color: #fff; background-color: #fff;
padding: 20rpx; padding: 20rpx;
box-sizing: border-box; box-sizing: border-box;
@@ -269,4 +435,83 @@ function clones(){
} }
} }
} }
.titleType{
display: inline-block
border-radius: 4px;
font-size: 22rpx;
color: #157EFF;
width: 100rpx;
height: 38rpx;
text-align: center;
line-height: 38rpx;
margin-left: 10rpx;
}
.primary{
border: 1px solid #157EFF!important;
color: #157EFF!important
}
.success{
border: 1px solid #05A636!important;
color: #05A636!important
}
.info{
border: 1px solid #898989!important;
color: #898989!important
}
.tertiary{
border: 1px solid #E6A340!important;
color: #E6A340!important
}
.primary2{
border: 1px solid #F56C6C!important;
color: #F56C6C!important
}
.rightBtn{
width: 140rpx;
height: 44rpx;
line-height: 44rpx;
background: linear-gradient(90deg, #00C0FA 0%, #1271FF 100%);
border-radius: 4px;
color: #fff;
font-size: 24rpx;
text-align: center;
}
.detailTitle{
font-size: 32rpx;
font-weight: 600;
margin: 30rpx 0;
}
.detailCon{
font-size: 28rpx;
line-height: 40rpx;
}
.exam-info {
display: flex;
justify-content: space-between;
margin-bottom: 35rpx;
margin-top: 20rpx;
}
.info-item {
flex: 1;
text-align: center;
}
.info-value {
font-family: 'D-DIN-Medium';
font-size: 26rpx;
font-weight: 600;
color: #409EFF;
margin-bottom: 8rpx;
}
.info-label {
font-size: 26rpx;
color: #333;
}
.info-divider {
width: 2px;
background-color: #C3E1FF;
}
</style> </style>

View File

@@ -0,0 +1,605 @@
<template>
<div class="app-box">
<image src="../../../static/images/train/bj.jpg" class="bjImg" mode=""></image>
<div class="con-box">
<div class="header">
<div>正确率{{accuracyRate}}%</div>
<div>用时{{formattedTime}}</div>
<div class="headBtn" v-if="isRunning" @click="pause">暂停</div>
<div class="headBtn" v-if="!isRunning" @click="start">继续</div>
</div>
<div class="problemCard">
<div v-for="(item,index) in problemData" :key="index">
<template v-if="questionIndex==(index+1)">
<div class="problemTitle">
<span class="titleType" v-if="item.type=='single'">单选题</span>
<span class="titleType" v-if="item.type=='multiple'">多选题</span>
<span class="titleType" v-if="item.type=='judge'">判断题</span>
<span>{{item.content}}</span>
</div>
<div class="options" v-if="item.type=='single'">
<div class="opt" @click="selected(i)" :class="radio!==''&&i==radio?'active':''" v-for="(val,i) in parseOptions(item.trainChooses)">
<div class="optLab">{{indexToLetter(i)}}</div>
<span>{{val}}</span>
</div>
</div>
<div class="options" v-if="item.type=='multiple'">
<div class="opt" @click="selected2(i)" :class="judgment(i)?'active':''" v-for="(val,i) in parseOptions(item.trainChooses)">
<div class="optLab">{{indexToLetter(i)}}</div>
<span>{{val}}</span>
</div>
</div>
<div class="options" v-if="item.type=='judge'">
<div class="opt" @click="selected3('正确')" :class="radio2=='正确'?'active':''">
<span>正确</span>
</div>
<div class="opt" @click="selected3('错误')" :class="radio2=='错误'?'active':''">
<span>错误</span>
</div>
</div>
<div class="analysis" v-if="analysis">
<div class="analysisHead correct" v-if="judgWhether=='正确'">
<div>回答正确</div>
<div></div>
</div>
<div class="analysisHead errors" v-if="judgWhether=='错误'">
<div>回答错误</div>
<div></div>
</div>
<div class="analysisCon">
<div class="parse1">正确答案</div>
<div class="parse2" v-if="item.type=='single'" style="color: #30A0FF;font-weight: bold;">{{String.fromCharCode(65 + Number(item.answer))}}.</div>
<div class="parse2" v-if="item.type=='multiple'" style="color: #30A0FF;font-weight: bold;">
<span v-for="(val,i) in parseOptions(item.answer)">{{indexToLetter(val-1)}}.</span>
</div>
<div class="parse2" v-if="item.type=='judge'" style="color: #30A0FF;font-weight: bold;">{{item.answer}}</div>
</div>
<div class="analysisCon">
<div class="parse1">答案解析</div>
<div class="parse2">{{item.answerDesc}}</div>
</div>
<div class="analysisCon">
<div class="parse1">知识点</div>
<div>
<el-tag style="margin-right: 10px;">{{item.knowledgePoint}}</el-tag>
</div>
</div>
</div>
<div class="problemBtns">
<div v-if="analysis&&judgWhether!=''&&questionIndex!=problemData.length" @click="questionIndex+=1">下一题</div>
<div v-else :class="((radio===''&&radio2===''&&checkList.length==0&&isRunning)||analysis)?'events':''" @click="submit()">提交答案</div>
</div>
</template>
</div>
</div>
<div class="footer">
<div class="footerLeft">
<div class="zuo" :class="questionIndex==1?'events':''" @click="questionIndex-=1"></div>
<div class="you" :class="questionIndex==problemData.length?'events':''" @click="questionIndex+=1"></div>
<div @click="collect(1)" style="text-align: center;font-size: 24rpx;" v-if="(problemData[questionIndex - 1]?.isCollect || 0)!=1">
<image :src="urls+'wsc.png'" mode="" style="width: 34rpx;height: 32rpx;"></image>
<div>收藏</div>
</div>
<div @click="collect(0)" style="text-align: center;font-size: 24rpx;" v-if="(problemData[questionIndex - 1]?.isCollect || 0)==1">
<image :src="urls+'video-sc.png'" mode="" style="width: 34rpx;height: 32rpx;"></image>
<div>取消</div>
</div>
</div>
<div class="footerBtn" @click="exit()">完成练习</div>
<div class="footerLeft">
<div>
<div class="icons" style="background-color: #1CADF5;"></div>
<div class="texts" style="color: #1CADF5;">{{correctIndex}}</div>
</div>
<div>
<div class="icons" style="background-color: #FF6668;">×</div>
<div class="texts" style="color: #FF6668;">{{errorsIndex}}</div>
</div>
<div @click="dialogVisible=true">
<div><span style="color: #1CADF5;">{{questionIndex}}</span>/{{problemData.length}}</div>
<div>题号</div>
</div>
</div>
</div>
</div>
<div class="cards" v-if="dialogVisible">
<div class="cardCon">
<div class="cardHead">
<div>题号</div>
<div style="font-size: 40rpx;" @click="clones()">×</div>
</div>
<div class="questionNums">
<div class="questions" :class="item.whether=='正确'?'questionCorrect':item.whether=='错误'?'questionError':questionIndex==(index+1)?'questionsActive':''" @click="switchs(index)" v-for="(item,index) in problemList" :key="index">{{index+1}}</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, inject, watch, ref, onMounted,onBeforeUnmount,computed } from 'vue';
import { onLoad, onShow } from '@dcloudio/uni-app';
const { $api,urls , navTo,navBack , vacanciesTo, formatTotal, config } = inject('globalFunction');
import useUserStore from '@/stores/useUserStore';
import useDictStore from '@/stores/useDictStore';
const userInfo = ref({});
const Authorization = ref('');
const radio = ref('');
const radio2 = ref('');
const checkList = ref([]);
const questionIndex = ref(1);
const correctIndex = ref(0);
const errorsIndex = ref(0);
const accuracyRate = ref(0);
const elapsedTime = ref(0);
const analysis = ref(false);
const judgWhether = ref('');
const isRunning = ref(false);
const dialogVisible = ref(false);
const problemData = ref([]);
const problemList = ref([]);
let timer = null;
const formattedTime = computed(() => {
const minutes = Math.floor(elapsedTime.value / 60)
const seconds = elapsedTime.value % 60
return `${padTime(minutes)}:${padTime(seconds)}`
});
watch(questionIndex, (newVal, oldVal) => {
radio.value=""
radio2.value=""
checkList.value=[]
analysis.value=false
judgWhether.value=""
});
// watch(problemData, (newVal, oldVal) => {
// problemList.value=[];
// newVal.forEach((item,i)=>{
// problemList.value.push({index:i+1,whether:""})
// })
// });
onLoad((options) => {
Authorization.value=uni.getStorageSync('Padmin-Token')||''
getHeart();
});
onShow(()=>{
})
onBeforeUnmount(() => {
if (timer) {
clearInterval(timer); // 清除定时器
timer = null; // 防止内存泄漏,确保下次不会再误用已清除的定时器
}
});
function getHeart() {
const raw =Authorization.value;
const token = typeof raw === "string" ? raw.trim() : "";
const headers = token ? { 'Authorization': raw.startsWith("Bearer ") ? raw : `Bearer ${token}` }: {}
$api.myRequest("/dashboard/auth/heart", {}, "POST", 10100, headers).then((resData) => {
if (resData.code == 200) {
getUserInfo();
} else {
navTo('/packageB/login')
}
});
};
function getUserInfo(){
let header={
'Authorization':Authorization.value
}
$api.myRequest('/system/user/login/user/info', {},'get',10100,header).then((resData) => {
userInfo.value = resData.info || {};
// userId.value=resData.info.userId
queryData()
});
};
function queryData(){
problemData.value=[]
let header={
'Authorization':Authorization.value,
'Content-Type':"application/x-www-form-urlencoded"
}
$api.myRequest('/train/public/trainPractice/getQuestions', {
userId: userInfo.value.userId
},'post',9100,header).then((resData) => {
resData.forEach((item,i)=>{
problemData.value.push(item)
problemList.value.push({index:i+1,whether:""})
})
start()
accuracyRates()
});
}
function collect(is){
let header={
'Authorization':Authorization.value,
'Content-Type':"application/x-www-form-urlencoded"
}
$api.myRequest('/train/public/questionUser/addOrUpdateCollect', {
userId: userInfo.value.userId,
questionId:problemData.value[questionIndex.value-1].questionId,
collect:is
},'post',9100,header).then((resData) => {
problemData.value[questionIndex.value-1].isCollect=is
});
};
//正确率
function accuracyRates(){
let header={
'Authorization':Authorization.value,
'Content-Type':"application/x-www-form-urlencoded"
}
$api.myRequest('/train/public/trainPractice/getCount', {
userId: userInfo.value.userId,
},'post',9100,header).then((resData) => {
accuracyRate.value=resData.truePresent
});
};
//提交答案
function submit(){
let indexs=questionIndex.value-1
let parm={
questionId:problemData.value[indexs].questionId,
userId:userInfo.value.userId,
answer:problemData.value[indexs].answer
}
if(problemData.value[indexs].type=='single'){
parm.submitAnswer=radio.value
}else if(problemData.value[indexs].type=='multiple'){
parm.submitAnswer=checkList.value.join(',')
}else if(problemData.value[indexs].type=='judge'){
parm.submitAnswer=radio2.value
}
let header={
'Authorization':Authorization.value,
'Content-Type':"application/json"
}
$api.myRequest('/train/public/trainPractice/submitAnswer', parm,'post',9100,header).then((resData) => {
if(resData&&resData.code==200){
analysis.value=true
judgWhether.value=resData.msg
problemList.value[indexs].whether=resData.msg
if(resData.msg=='正确'){
correctIndex.value++
}else if(resData.msg=='错误'){
errorsIndex.value++
}
accuracyRates()
}
});
};
function selected(i){
radio.value=i
};
//多选
function selected2(i){
let arr=checkList.value.join(",")
if(arr.indexOf(i) !== -1){
const index = checkList.value.indexOf(i);
if (index !== -1) {
checkList.value.splice(index, 1);
}
}else{
checkList.value.push(i)
}
};
function judgment(i){
let arr=checkList.value.join(",")
if(arr.indexOf(i) !== -1){
return true
}else{
return false
}
};
function selected3(i){
radio2.value=i
};
// 解析选项
function parseOptions(options) {
if (!options) return [];
// 假设options是字符串格式以分号分隔
if (typeof options === 'string') {
return options.split(',').filter(opt => opt.trim());
}
// 如果是数组,直接返回
if (Array.isArray(options)) {
return options;
}
return [];
};
function indexToLetter(index) {
// 将索引转换为对应的字母
return String.fromCharCode(65 + index);
};
function padTime(time) {
return time < 10 ? `0${time}` : time
};
function start() {
if (isRunning.value) return
isRunning.value = true
timer = setInterval(() => {
elapsedTime.value++
}, 1000)
};
function pause() {
if (!isRunning.value) return
clearInterval(timer)
isRunning.value = false
};
function clones(){
dialogVisible.value=false
};
function switchs(i){
questionIndex.value=(i+1)
dialogVisible.value=false
};
function exit(){
navBack()
}
</script>
<style lang="stylus" scoped>
.app-box{
width: 100%;
height: 100vh;
position: relative;
.bjImg{
position: absolute;
width: 100%;
height: 100%;
}
.con-box{
position: absolute;
width: 100%;
height: 100%;
left: 0;
top:0;
z-index: 10;
padding: 20rpx 28rpx;
box-sizing: border-box;
.header{
height: 100rpx;
padding: 0 10rpx;
display: flex;
align-items: center;
justify-content: space-between;
background: linear-gradient(0deg, #4285EC 0%, #0BBAFB 100%);
color: #fff;
font-size: 26rpx;
border-radius: 10rpx
.headBtn{
background: #499FFF;
border-radius: 4px;
width: 100rpx;
text-align: center;
height: 50rpx;
line-height: 50rpx;
}
}
.problemCard{
margin-top: 30rpx;
.problemTitle{
font-size: 30rpx;
.titleType{
display: inline-block;
background-color: #499FFF;
border-radius: 10rpx 10rpx 10rpx 0;
padding: 8rpx 12rpx;
color: #fff;
font-size: 26rpx;
margin-right: 20rpx;
}
}
.options{
margin-top: 30rpx;
.opt{
height: 60rpx;
/* background-color: #F8F9FA; */
border-radius: 5px;
margin-bottom: 15px;
display: flex;
align-items: center;
padding-left: 30rpx;
box-sizing: border-box;
color: #808080;
font-size: 30rpx;
.optLab{
width: 40rpx;
height: 40rpx;
text-align: center;
line-height: 40rpx;
border-radius: 50%;
background-color: #8C8C8C;
color: #fff;
font-weight: 600;
font-size: 32rpx;
margin-right: 20rpx;
}
}
.active{
background: linear-gradient(90deg, #25A9F5 0%, #B1DBFF 100%);
color: #fff!important;
font-weight: bold;
}
.active>view{
background-color: #fff!important;
color: #25A9F5!important;
}
}
.analysis{
margin-top: 30rpx;
background-color: #fff;
border-radius: 6px;
margin-bottom: 15rpx;
border: 1px solid #10A8FF;
padding: 20rpx;
box-sizing: border-box;
.analysisHead{
display: flex;
align-items: center;
justify-content: space-between;
font-size: 32rpx;
font-family: Microsoft YaHei;
font-weight: bold;
letter-spacing: 2px;
}
.correct{
color: #67C23A;
}
.errors{
color: #F06A6A;
}
.analysisCon{
margin-top: 30rpx;
.parse1{
font-size: 30rpx;
font-family: Microsoft YaHei;
font-weight: bold;
}
.parse2{
font-size: 26rpx;
color: #333;
margin-top: 10px;
}
}
}
.problemBtns{
display: flex
align-items: center
justify-content: center
view{
width: 140rpx
height: 50rpx
text-align: center
line-height: 50rpx
background-color: #10A8FF
color: #fff
font-size: 28rpx
border-radius: 5rpx
margin-right: 10rpx;
}
}
}
.footer{
width: 100%;
height: 120rpx;
border-top: 1px solid #ddd
position: fixed
bottom: 0
left: 0
display: flex
align-items: center
justify-content: space-between
.footerLeft{
display: flex
align-items: center
font-size: 30rpx;
text-align: center
.zuo{
width: 26rpx;
height: 26rpx;
border-top: 2px solid #666
border-left: 2px solid #666
transform: rotate(-45deg); /* 鼠标悬停时旋转360度 */
margin-left: 60rpx;
}
.you{
width: 26rpx;
height: 26rpx;
border-right: 2px solid #666
border-bottom: 2px solid #666
transform: rotate(-45deg); /* 鼠标悬停时旋转360度 */
// margin-left: 30rpx;
margin-right: 50rpx;
}
.icons{
width: 30rpx;
height: 30rpx;
color: #fff;
text-align: center;
line-height: 30rpx;
border-radius: 50%
}
.texts{
font-size: 24rpx;
}
}
.footerLeft>view{
margin-right: 40rpx;
}
.footerBtn{
width: 140rpx
height: 50rpx
text-align: center
line-height: 50rpx
background-color: #67C23A
color: #fff
font-size: 28rpx
border-radius: 5rpx
}
}
}
.cards{
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100vh;
background-color: rgba(0,0,0,0.5);
z-index: 1000;
padding: 100rpx 50rpx;
box-sizing: border-box;
.cardCon{
height: 100%;
background-color: #fff;
padding: 20rpx;
box-sizing: border-box;
.cardHead{
display: flex;
align-items: center;
justify-content: space-between;
font-size: 30rpx;
font-weight: 600;
}
.questionNums{
width: 100%;
display: flex;
flex-wrap: wrap;
}
.questions{
width: 60rpx;
height: 60rpx;
text-align: center;
line-height: 60rpx;
border-radius: 8rpx;
border: 2px solid #E0E0E0;
font-size: 28rpx;
margin-right: 15px;
cursor: pointer;
}
.questionsActive{
background-color: #F0F9FF;
border: 2px solid #409EFF;
}
.questionCorrect{
background-color: #F0F9FF;
border: 2px solid #64BC38;
color: #6BC441;
}
.questionError{
background-color: #FFF1F0;
border: 2px solid #F56C6C;
color: #F36B6B;
}
}
}
}
.events{
pointer-events: none; /* 这会禁用所有指针事件 */
opacity: 0.5; /* 可选:改变透明度以视觉上表示不可点击 */
cursor: not-allowed; /* 可选:改变鼠标光标样式 */
}
</style>

View File

@@ -68,7 +68,7 @@
</div> </div>
<div class="problemBtns"> <div class="problemBtns">
<div v-if="analysis&&judgWhether!=''&&questionIndex!=problemData.length" @click="questionIndex+=1">下一题</div> <div v-if="analysis&&judgWhether!=''&&questionIndex!=problemData.length" @click="questionIndex+=1">下一题</div>
<div v-else :class="((radio==''&&radio2==''&&checkList.length==0&&isRunning)||analysis)?'events':''" @click="submit()">提交答案</div> <div v-else :class="((radio===''&&radio2===''&&checkList.length==0&&isRunning)||analysis)?'events':''" @click="submit()">提交答案</div>
</div> </div>
</template> </template>
</div> </div>

View File

@@ -1,9 +1,10 @@
<template> <template>
<view class="upload-container"> <view class="upload-container">
<input type="file" multiple="multiple" accept="image/*" @change="handleFileChange"> <view @click="chooseAndUploadFile" class="upload-button">+ 上传文件</view>
<!-- <uni-upload :disabled="disabled" :width="width" :height="height" :fileList="internalFileList" :name="name" :multiple="multiple" <view v-for="(item, index) in internalFileList" :key="index" class="files-list">
:maxCount="maxCount" @afterRead="handleAfterRead" @delete="handleRemove"> <view class="file-name">{{ item.file.name }}</view>
</uni-upload> --> <view class="delete-btn" @click="deleteFile(index)">删除</view>
</view>
</view> </view>
</template> </template>
@@ -11,7 +12,9 @@
// import { // import {
// uploadImg // uploadImg
// } from '@/api/company' // } from '@/api/company'
import config from '@/config' // import config from '@/config'
import config from '@/utilsRc/config.js'
import { getToken } from "@/utilsRc/auth";
//import { //import {
// getToken // getToken
//} from '@/utils/auth' //} from '@/utils/auth'
@@ -23,7 +26,7 @@
}, },
allowedFormats: { allowedFormats: {
type: Array, type: Array,
default: () => [], // 允许的文件格式 default: () => ['.png', '.jpg', '.jpeg', '.doc', '.docx', '.pdf', '.xls', '.xlsx'], // 允许的文件格式
}, },
maxImageSize: { maxImageSize: {
type: Object, type: Object,
@@ -74,6 +77,106 @@
}, },
}, },
methods: { methods: {
deleteFile(index){
this.internalFileList.splice(index, 1);
},
chooseAndUploadFile() {
wx.chooseMessageFile({
count: this.maxCount,
extension: this.allowedFormats,
// ['.png', '.jpg', '.jpeg', '.doc', '.docx', '.pdf', '.xls', '.xlsx' ],
success: (res) => {
console.log('选择文件成功:', res);
if(this.maxCount - this.internalFileList.length < res.tempFiles.length){
uni.showToast({
title: '最多只能上传' + this.maxCount + '个文件',
icon: 'none'
});
return;
}
let path = "";
const twoMBInBytes = 2 * 1024 * 1024; // 2MB转换为字节数
res.tempFiles.forEach((file) => {
if (file.size > twoMBInBytes) {
uni.showToast({
title: "图片大小不能超过2MB",
icon: "none",
});
return;
}
if (res.tempFiles && res.tempFiles.length > 0) {
path = file.path;
if (this.allowedFormats.indexOf('.'+path.split(".")[1])!=-1) {
uni.showLoading();
const tempFilePath = file;
uni.uploadFile({
url: config.baseUrl+'/system/oss/upload', //图片上传地址
filePath: tempFilePath.path,
name: 'file',
formData: {},
header: {
// 'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJQSlUyVlJCc1E1aXRMMWgxdjNkcVh2eER1c2VVc0hvRiIsInVzZXJJZCI6MX0.z4Z2XqgXyU0GQU-i7Bsa5T-zCKApTxj1YQ73rk7bAVo'
'Authorization': 'Bearer ' + getToken(),
},
success: (res) => {
var data = JSON.parse(res.data);
console.log(data, 'sdfjiosdjfoi')
if(data.code==200) {
this.internalFileList.push({
url: data.data.url,
file: file
})
this.$emit('update', this.internalFileList);
// this.serviceForm.fileUrl = this.internalFileList.map(item => item.url).join(',')
this.$forceUpdate()
uni.hideLoading();
} else {
uni.hideLoading();
uni.showToast({
title: res.msg || '上传失败',
icon: 'none',
duration: 2000
});
}
},
fail: (error) => {
uni.showToast({
title: '上传失败',
icon: 'none'
});
console.error(error);
}
})
} else {
uni.showToast({
icon: "none",
duration: 1500,
title: `只能选择${this.allowedFormats.join('、')}格式文件`,
});
}
}
})
// // 添加新选择的图片到列表
// res.tempFiles.forEach((item, index) => {
// this.fileList.push({
// url: item.path,
// file: res.tempFiles[index]
// });
// });
// 更新 serviceForm.fileUrl
// this.updateFileUrls();
},
fail: (err) => {
console.error('选择图片失败:', err);
}
});
},
// 新增图片 // 新增图片
async handleAfterRead(event) { async handleAfterRead(event) {
let lists = [].concat(event.file); let lists = [].concat(event.file);
@@ -141,11 +244,25 @@
}; };
</script> </script>
<style scoped> <style scoped lang="scss">
.upload-container { .upload-container {
}
.files-list {
display: flex; display: flex;
align-items: center; justify-content: space-between;
justify-content: center; margin-top: 10rpx;
line-height: 50rpx;
.file-name{
width: calc(100% - 80rpx);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.delete-btn{
width: 80rpx;
text-align: right;
color: red;
}
} }
.upload-slot { .upload-slot {
@@ -156,4 +273,13 @@
border-radius: 4px; border-radius: 4px;
padding: 20px; padding: 20px;
} }
.upload-button {
border: 1px dashed #ccc;
border-radius: 4px;
padding: 0 24rpx;
width: 280rpx;
text-align: center;
background: #fff;
line-height: 64rpx;
}
</style> </style>

View File

@@ -67,13 +67,7 @@
:localdata="jingbrList1" :localdata="jingbrList1"
@change="handleAgentChange" @change="handleAgentChange"
> >
</uni-data-select> </uni-data-select>
<!-- <el-option
v-for="item in jingbrList1"
:key="item.userId"
:label="item.nickName"
:value="item.userId"
></el-option> -->
</view> </view>
</view> </view>
@@ -190,10 +184,10 @@
</template> </template>
<script> <script>
import config from '@/utilsRc/config.js'
import {getJbrInfo} from "@/apiRc/personinfo/index" import {getJbrInfo} from "@/apiRc/personinfo/index"
import {addInvestigate} from "@/apiRc/needs/person" import {addInvestigate} from "@/apiRc/needs/person"
import { getDicts } from '@/apiRc/system/dict.js'; import { getDicts } from '@/apiRc/system/dict.js';
import config from '@/utilsRc/config.js'
import { getToken } from "@/utilsRc/auth"; import { getToken } from "@/utilsRc/auth";
export default { export default {
data() { data() {
@@ -401,25 +395,6 @@ export default {
console.error('选择图片失败:', err); console.error('选择图片失败:', err);
} }
}); });
// uni.chooseImage({
// count: remainingCount,
// sizeType: ['original', 'compressed'],
// sourceType: ['album', 'camera'],
// success: (res) => {
// // 添加新选择的图片到列表
// res.tempFilePaths.forEach((path, index) => {
// this.fileList.push({
// url: path,
// file: res.tempFiles[index]
// });
// });
// // 更新 serviceForm.fileUrl
// this.updateFileUrls();
// },
// fail: (err) => {
// console.error('选择图片失败:', err);
// }
// });
}, },
// 移除图片 // 移除图片

View File

@@ -60,7 +60,7 @@
</view> </view>
</scroll-view> </scroll-view>
</view> </view>
<uni-popup ref="show" @close="close" @open="open" backgroundColor="#fff" type="bottom"> <uni-popup ref="show" @close="close" @open="open" background-color="#fff" type="bottom">
<view class="dialog_div"> <view class="dialog_div">
<view class="dialog_div_top"> <view class="dialog_div_top">
<view @click="close">取消</view> <view @click="close">取消</view>

View File

@@ -1,7 +1,7 @@
<!-- <!--
* @Date: 2025-10-16 15:15:47 * @Date: 2025-10-16 15:15:47
* @LastEditors: shirlwang * @LastEditors: shirlwang
* @LastEditTime: 2025-11-04 16:34:54 * @LastEditTime: 2025-11-06 11:24:06
--> -->
<template> <template>
<view> <view>
@@ -11,17 +11,17 @@
<view class="kinggang"> <view class="kinggang">
<view> <view>
<view class="num-title" style="color: #1A62CE">重点毕业生数</view> <view class="num-title" style="color: #1A62CE">重点毕业生数</view>
<view>1120</view> <view>{{infoData.allPersonCount}}</view>
</view> </view>
<text style="color: #B5C1D1;"></text> <text style="color: #B5C1D1;"></text>
<view> <view>
<view class="num-title" style="color: #16ACB7">累计需求数</view> <view class="num-title" style="color: #16ACB7">累计需求数</view>
<view>1120</view> <view>{{infoData.demandNum}}</view>
</view> </view>
<text style="color: #B5C1D1;"></text> <text style="color: #B5C1D1;"></text>
<view> <view>
<view class="num-title" style="color: #6A57D1">累计服务数</view> <view class="num-title" style="color: #6A57D1">累计服务数</view>
<view>1120</view> <view>{{infoData.fwNum}}</view>
</view> </view>
</view> </view>
<view class="trace-line"> <view class="trace-line">
@@ -35,7 +35,7 @@
<uni-icons color="#639AEB" type="arrow-right" size="16"></uni-icons> <uni-icons color="#639AEB" type="arrow-right" size="16"></uni-icons>
</view> </view>
</view> </view>
<view class="sendManager"> <!-- <view class="sendManager">
<view class="title"> <view class="title">
<image src="../../../packageRc/static/sendManager.png"/> <image src="../../../packageRc/static/sendManager.png"/>
任务下发管理员 任务下发管理员
@@ -44,7 +44,7 @@
<view>点击查看</view> <view>点击查看</view>
<uni-icons color="#DBAA4E" type="arrow-right" size="16"></uni-icons> <uni-icons color="#DBAA4E" type="arrow-right" size="16"></uni-icons>
</view> </view>
</view> </view> -->
</view> </view>
<view class="titles"> <view class="titles">
<view class="title-item active"><view>待办需求预警列表</view></view> <view class="title-item active"><view>待办需求预警列表</view></view>
@@ -60,6 +60,7 @@
<view style="color: #EF7325;">{{getDictLabel(item.currentStatus, qcjy_xqlc)}}</view> <view style="color: #EF7325;">{{getDictLabel(item.currentStatus, qcjy_xqlc)}}</view>
</view> </view>
</view> </view>
<view class="view-more-btn" @click="viewMore">查看更多内容</view>
<view class="titles"> <view class="titles">
<view class="title-item active"><view>待服务毕业生列表</view></view> <view class="title-item active"><view>待服务毕业生列表</view></view>
<view> {{jobListcount}} 条信息</view> <view> {{jobListcount}} 条信息</view>
@@ -92,6 +93,7 @@
<view @click="tiao(item)">服务</view> <view @click="tiao(item)">服务</view>
</view> </view>
</view> </view>
<view class="view-more-btn" @click="goPersonalList">查看更多内容</view>
</view> </view>
</scroll-view> </scroll-view>
@@ -149,11 +151,17 @@ function back() {
uni.navigateBack({ uni.navigateBack({
delta: 1 delta: 1
}); });
}; };
function viewMore() {
uni.navigateTo({
url: '/packageRc/pages/needs/needsList'
});
}
let qcjy_xqlx = ref([]) let qcjy_xqlx = ref([])
let qcjy_xqlc = ref([]) let qcjy_xqlc = ref([])
let infoData = ref({})
import {getDicts} from '@/apiRc/system/dict' import {getDicts} from '@/apiRc/system/dict'
import {getStatistic} from '@/apiRc/personinfo/index'
onMounted(() => { onMounted(() => {
getlist(); getlist();
getlistyujing(); getlistyujing();
@@ -163,6 +171,9 @@ onMounted(() => {
getDicts('qcjy_xqlc').then(res => { getDicts('qcjy_xqlc').then(res => {
qcjy_xqlc.value = res.data qcjy_xqlc.value = res.data
}); });
getStatistic().then(res => {
infoData.value = res.data
})
}); });
function getDictLabel(value, list) { function getDictLabel(value, list) {
const item = list.find(item => item.dictValue === value); const item = list.find(item => item.dictValue === value);
@@ -171,7 +182,7 @@ function getDictLabel(value, list) {
async function getlist(){ async function getlist(){
try { try {
const res = await personInfoList(); const res = await personInfoList({pageNum: 1, pageSize: 5})
console.log("res", res); console.log("res", res);
jobList.value = res.rows || []; jobList.value = res.rows || [];
jobListcount.value=res.total || 0 jobListcount.value=res.total || 0
@@ -183,7 +194,7 @@ async function getlist(){
async function getlistyujing(){ async function getlistyujing(){
try { try {
const res = await personAlertList(); const res = await personAlertList({pageNum: 1, pageSize: 5});
console.log("res", res); console.log("res", res);
jobList1.value = res.rows || []; jobList1.value = res.rows || [];
jobList1count.value=res.total || 0 jobList1count.value=res.total || 0
@@ -259,11 +270,6 @@ function cancelReturn() {
returnReasonPopup.value.close() returnReasonPopup.value.close()
} }
} }
function viewMore() {
// uni.navigateTo({
// url: '/pages/jobList/jobList'
// })
}
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
@@ -622,4 +628,16 @@ view{box-sizing: border-box;display: block;}
} }
} }
} }
.view-more-btn{
padding: 10rpx 56rpx;
background: #FFFFFF;
color: #4C6EFB;
border: 1rpx solid #4C6EFB;
text-align: center;
border-radius: 40rpx;
width: fit-content;
margin: 0 auto;
margin-bottom: 20rpx;
}
</style> </style>

View File

@@ -22,7 +22,7 @@
<view class="content"> <view class="content">
<view class="personnelInformation"> <view class="personnelInformation">
<view class="left"> <view class="left">
<view class="left_name">{{ form?.name || '' }}</view> <view class="left_name">{{ form.name || '' }}</view>
<view style="margin-top: 10rpx"> <view style="margin-top: 10rpx">
<text v-if="form.gender == 0"></text> <text v-if="form.gender == 0"></text>
<text v-if="form.gender == 1"></text> <text v-if="form.gender == 1"></text>
@@ -413,8 +413,8 @@
></u-datetime-picker> --> ></u-datetime-picker> -->
<!-- 社区端 - 显示隐藏退出组件 --> <!-- 社区端 - 显示隐藏退出组件 -->
<exitPopup /> <exitPopup />
<DealDone ref="dealDone" @finished="getListPersonDemand();"/>
<uni-popup background-color="#fff" type="bottom" <!-- <uni-popup background-color="#fff" type="bottom"
ref="openDeal" ref="openDeal"
style="position: relative; z-index: 100" style="position: relative; z-index: 100"
closeOnClickOverlay closeOnClickOverlay
@@ -442,25 +442,31 @@
end="2030-6-20" end="2030-6-20"
@change="change" @change="change"
/> />
<!-- <text :class="formData.actualSolveDate ? 'picker-text' : 'picker-placeholder'">
{{ formData.actualSolveDate || "请选择实际解决时间" }}
</text> -->
</view> </view>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="经办人" prop="agentUserName" required> <uni-forms-item label="经办人" prop="agentUserName" required>
<view class="input-view"> <view class="input-view">
<input <uni-data-select
v-model="formData.agentUserName" style="width: 100%"
border="none" v-model="formData.agentUserId"
placeholder="请输入经办人姓名" placeholder="请选择经办人"
:customStyle="{ :localdata="jingbrList1"
padding: '28rpx 36rpx', @change="handleAgentChange"
fontSize: '28rpx', >
color: '#333333' </uni-data-select>
}"
/>
</view> </view>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="人员状态" prop="fileUrl">
<picker
@change="onpersonStatusChange"
:range="personStatusOptions.map(item => item.label)"
:value="getpersonStatusIndex(formData.personStatus)"
mode="selector"
>
<view style="border: 1px solid #e4e4e4;width: 100%;padding: 0 20rpx;line-height: 64rpx;white-space: nowrap;text-overflow: ellipsis;flex-grow: 1;">{{ getpersonStatusLabel(formData.personStatus) || "请选择" }}</view>
</picker>
</uni-forms-item>
<uni-forms-item label="附件" prop="fileUrl"> <uni-forms-item label="附件" prop="fileUrl">
<ImageUpload <ImageUpload
:fileList="fileList" :fileList="fileList"
@@ -474,12 +480,7 @@
<textarea <textarea
v-model="formData.solveDesc" v-model="formData.solveDesc"
placeholder="请输入解决说明" placeholder="请输入解决说明"
:customStyle="{ style="padding: 28rpx 36rpx;border: 1px solid #e4e4e4;padding: 10rpx;border-radius: 8rpx;font-size: 28rpx;color:#333333;height: 120rpx;"
padding: '28rpx 36rpx',
fontSize: '28rpx',
color: '#333333',
minHeight: '120rpx'
}"
></textarea> ></textarea>
</view> </view>
</uni-forms-item> </uni-forms-item>
@@ -495,28 +496,31 @@
" "
>重置</view >重置</view
> >
<view class="btn save" @click="finishJobRecommend(needsType)" <view class="btn save" @click="finishJobRecommend()"
>办结</view >办结</view
> >
</view> </view>
</uni-popup> </uni-popup> -->
</view> </view>
</template> </template>
<script> <script>
import { getPersonInfo } from "../../api/company/index.js"; import { getPersonInfo } from "../../api/company/index.js";
// import { listJobService, serviceTraceability } from "@/api/needs/jobService"; // import { listJobService, serviceTraceability } from "@/api/needs/jobService";
import { listPersonDemand, delPersonDemand } from "../../api/needs/personDemand"; import { listPersonDemand, delPersonDemand } from "../../api/needs/personDemand";
import { requirementCompletion } from "@/apiRc/company/index"; import { requirementCompletion } from "@/apiRc/company/index";
// import { listEntrepreneurshipService } from "@/api/needs/entrepreneurshipService"; // import { listEntrepreneurshipService } from "@/api/needs/entrepreneurshipService";
// import { listTrainService, delTrainService } from "@/api/needs/trainService"; // import { listTrainService, delTrainService } from "@/api/needs/trainService";
import { listJobType } from "../../api/jobType/index"; import { listJobType } from "../../api/jobType/index";
import ImageUpload from "@/packageRc/components/ImageUpload"; // import ImageUpload from "@/packageRc/components/ImageUpload";
import {getJbrInfo} from "@/apiRc/personinfo/index"
import DealDone from "../needs/dealDone.vue";
export default { export default {
name: "serviceDetails", name: "serviceDetails",
components: { components: {
ImageUpload, // ImageUpload,
DealDone,
}, },
data() { data() {
@@ -580,6 +584,8 @@ export default {
disabled: false, disabled: false,
showPersonStatusPicker: false, showPersonStatusPicker: false,
personStatusLabel: '', personStatusLabel: '',
jingbrList1: [],
personStatusOptions: [],
}; };
}, },
onLoad(options) { onLoad(options) {
@@ -588,6 +594,22 @@ export default {
this.form.userId = options.userId; // 确保userId被正确赋值 this.form.userId = options.userId; // 确保userId被正确赋值
console.log("options", options); console.log("options", options);
this.getPersonInfo11(); this.getPersonInfo11();
this.$getDict('qcjy_ryzt').then(res => {
if (res.data && Array.isArray(res.data)) {
this.personStatusOptions = res.data.map(item => ({
value: item.dictValue,
label: item.dictLabel
}));
}
});
getJbrInfo().then(res => {
this.jingbrList1=res.map(ele => {
return {
value: ele.userId,
text: ele.nickName
}
})
})
}, },
onShow() { onShow() {
@@ -598,42 +620,43 @@ export default {
created(){ created(){
}, },
mounted() {
// 注释掉getDicts调用避免运行时错误
/*
let arr = [
{
key: "qcjy_zgzpgz",
prop: "highRecruitmentSalary",
},
{
key: "qcjy_zgzpgz",
prop: "minRecruitmentSalary",
},
{
key: "qcjy_ryzt",
prop: "personStatusList",
},
];
arr.forEach((ele, index) => {
this.$getDict(ele.key).then((res) => {
this.dict[ele.prop] = res.data;
this.$forceUpdate();
});
});
*/
// 暂时注释掉workTypeRemoteMethod调用避免listJobType未定义错误
// if (typeof this.workTypeRemoteMethod === 'function') {
// this.workTypeRemoteMethod();
// }
// this.getListPersonDemand();
// this.getJobSearchList();
// this.getListOfEntrepreneurialNeeds();
// this.getTrainingList();
},
methods: { methods: {
// 获取帮扶内容标签
getpersonStatusLabel(value) {
let arr = this.personStatusOptions.filter(item => item.value == value)
return arr.length ? arr[0].label : ''
},
getpersonStatusIndex(value) {
if (!value) return 0;
const index = this.personStatusOptions.findIndex(item => item.value === value);
return index !== -1 ? index : 0;
},
// 处理人员状态选择变化
onpersonStatusChange(e) {
const index = e.detail.value;
if (this.personStatusOptions && this.personStatusOptions[index]) {
this.formData.personStatus = this.personStatusOptions[index].value;
}
},
// 获取经办人名称
getAgentUserName(userId) {
const agent = this.jingbrList1.find(item => item.value === userId);
return agent ? agent.nickName : '';
},
// 处理经办人选择变化
handleAgentChange(value) {
if (!value || !this.jingbrList1 || !this.jingbrList1.length) {
this.formData.agentUserName = '';
return;
}
const user = this.jingbrList1.find(item => item.value === value);
if (user) {
this.formData.agentUserName = user.nickName;
} else {
this.formData.agentUserName = '';
}
},
closeopenDeal() { closeopenDeal() {
this.$refs.openDeal.close(); this.$refs.openDeal.close();
}, },
@@ -821,7 +844,7 @@ export default {
}); });
}, },
// 办结按钮 // 办结按钮
async finishJobRecommend(needsType) { async finishJobRecommend() {
uni.showLoading(); uni.showLoading();
try { try {
// 先进行表单校验 // 先进行表单校验
@@ -879,19 +902,25 @@ export default {
this.formData.fileUrl.push(url); this.formData.fileUrl.push(url);
} }
} }
this.formData.fileUrl = this.$arrayToString(this.formData.fileUrl); this.formData.fileUrl = this.formData.fileUrl.join(',')
}, },
// 需求办结 // 需求办结
requirementHandling(item, needsType) { requirementHandling(item, needsType) {
// this.openDeal = true; // this.openDeal = true;
this.$refs.openDeal.open(); // this.$refs.openDeal.open();
this.needsType = needsType; this.$refs.dealDone.init({
this.formData = {
id: item.id, id: item.id,
currentStatus: "3", currentStatus: "3",
userId: item.userId, userId: item.userId,
personStatus: item.personStatus || (this.dict.personStatusList[0] && this.dict.personStatusList[0].dictValue), personStatus: item.personStatus || (this.dict.personStatusList[0] && this.dict.personStatusList[0].dictValue),
}; });
// this.needsType = needsType;
// this.formData = {
// id: item.id,
// currentStatus: "3",
// userId: item.userId,
// personStatus: item.personStatus || (this.dict.personStatusList[0] && this.dict.personStatusList[0].dictValue),
// };
console.log("item",item) console.log("item",item)
this.$nextTick(() => { this.$nextTick(() => {
this.$forceUpdate(); this.$forceUpdate();

View File

@@ -1,18 +1,18 @@
<!-- <!--
* @Date: 2025-10-16 15:15:47 * @Date: 2025-10-16 15:15:47
* @LastEditors: shirlwang * @LastEditors: lip
* @LastEditTime: 2025-11-05 16:52:15 * @LastEditTime: 2025-11-06 13:01:17
--> -->
<template> <template>
<!-- @scroll="handleScroll" @scrolltolower="scrollBottom" --> <!-- @scroll="handleScroll" @scrolltolower="scrollBottom" -->
<scroll-view :scroll-y="true" class="container" style="background-image: url('../../../packageRc/static/pageBg.png');"> <scroll-view :scroll-y="true" class="container" style="background-image: url('../../../packageRc/static/pageBg.png');">
<view style="padding: 40rpx 28rpx;"> <view style="padding: 40rpx 28rpx;">
<view class="kinggang"> <view class="kinggang">
<view> <view @click="navTo('/packageA/pages/myResume/myResume')">
<image src="../../../packageRc/static/kinggang1.png"/> <image src="../../../packageRc/static/kinggang1.png"/>
<view>信息维护</view> <view>信息维护</view>
</view> </view>
<view> <view @click="navTo('/packageA/pages/Intendedposition/Intendedposition')">
<image src="../../../packageRc/static/kinggang5.png"/> <image src="../../../packageRc/static/kinggang5.png"/>
<view>投递记录</view> <view>投递记录</view>
</view> </view>
@@ -24,7 +24,7 @@
<image src="../../../packageRc/static/kinggang3.png"/> <image src="../../../packageRc/static/kinggang3.png"/>
<view>虚拟面试</view> <view>虚拟面试</view>
</view> </view>
<view> <view @click="goCa">
<image src="../../../packageRc/static/kinggang4.png"/> <image src="../../../packageRc/static/kinggang4.png"/>
<view>素质测评</view> <view>素质测评</view>
</view> </view>
@@ -38,7 +38,7 @@
<view class="title-item" :class="{active: activeTitle == 1}" @click="activeTitle = 1,getJobRecommed()"><view>推荐岗位</view></view> <view class="title-item" :class="{active: activeTitle == 1}" @click="activeTitle = 1,getJobRecommed()"><view>推荐岗位</view></view>
<view class="title-item" :class="{active: activeTitle == 2}" @click="activeTitle = 2,getJobList()"><view>热门岗位</view></view> <view class="title-item" :class="{active: activeTitle == 2}" @click="activeTitle = 2,getJobList()"><view>热门岗位</view></view>
</view> </view>
<view v-for="(item, index) in jobList" :key="index" class="job-list"> <view v-for="(item, index) in jobList" :key="index" @click="nextDetail(item)" class="job-list">
<view class="top-line"> <view class="top-line">
<view class="salary">{{item.minSalary}}-{{item.maxSalary}}/</view> <view class="salary">{{item.minSalary}}-{{item.maxSalary}}/</view>
<view class="time"><uni-icons color="#A2A2A2" type="info" size="12"></uni-icons>发布日期{{ item.postingDate }}</view> <view class="time"><uni-icons color="#A2A2A2" type="info" size="12"></uni-icons>发布日期{{ item.postingDate }}</view>
@@ -98,10 +98,14 @@ onMounted(()=>{
getJobRecommed() getJobRecommed()
}) })
function goCa(){
if (checkLogin()) {
const userInfo = uni.getStorageSync('userInfo')
navTo(`/packageCa/search/search?userId=${userInfo.userId}&name=${userInfo.name}`);
}
}
function viewMore() { function viewMore() {
// uni.navigateTo({ navTo(`/packageRc/pages/jobList/jobList`);
// url: '/pages/jobList/jobList'
// })
} }
function tiao(){ function tiao(){
console.log('尝试导航到待办详情页面'); console.log('尝试导航到待办详情页面');
@@ -168,6 +172,26 @@ function changeJobType(val){
getJobList() getJobList()
} }
} }
// 登录检查函数
import { storeToRefs } from 'pinia';
const { userInfo, hasLogin, token } = storeToRefs(useUserStore());
const checkLogin = () => {
const tokenValue = uni.getStorageSync('token') || '';
if (!tokenValue || !hasLogin.value) {
// 未登录,打开授权弹窗
wxAuthLoginRef.value?.open();
return false;
}
return true;
};
// 跳转到详情页面
function nextDetail(job) {
// 登录检查
if (checkLogin()) {
navTo(`/packageA/pages/post/post?jobId=${encodeURIComponent(job.jobId)}`);
}
}
</script> </script>

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
<!-- <!--
* @Date: 2024-10-08 14:29:36 * @Date: 2024-10-08 14:29:36
* @LastEditors: shirlwang * @LastEditors: shirlwang
* @LastEditTime: 2025-11-04 17:33:17 * @LastEditTime: 2025-11-06 12:14:22
--> -->
<template> <template>
<view class="input-outer-part"> <view class="input-outer-part">
@@ -13,12 +13,12 @@
color="#A6A6A6"></u-icon></view> color="#A6A6A6"></u-icon></view>
</view> </view>
<view class="inner-part"> <view class="inner-part">
<uni-forms labelPosition="left" :model="formData" :rules="rules" ref="uForm" class="self-form" <uni-forms labelPosition="right" :model="formData" :rules="rules" ref="uForm" class="self-form"
labelWidth="100"> labelWidth="150rpx">
<uni-forms-item label="姓名" name="personName" required <uni-forms-item label="姓名" name="personName" required
v-if="$store.getters.roles.includes('shequn'|| $store.getters.roles.includes('gly'))" v-if="$store.getters.roles.includes('shequn'|| $store.getters.roles.includes('gly'))"
> >
<view style="width: 100%;" @click="openPersonChooser" <view class="input-area" style="width: 100%;" @click="openPersonChooser"
:class="{disabledLine: !edit||!canChoosePerson, noValue: !formData.personName}"> :class="{disabledLine: !edit||!canChoosePerson, noValue: !formData.personName}">
{{ formData.personName || '请选择' }} {{ formData.personName || '请选择' }}
</view> </view>
@@ -36,16 +36,16 @@
<radio :customStyle="{marginRight: '16px'}" label="否" value="否"></radio> <radio :customStyle="{marginRight: '16px'}" label="否" value="否"></radio>
</radio-group> --> </radio-group> -->
<view class="radio-group"> <view class="radio-group">
<view <view class="radio-item"
:class="['radio-item', { 'radio-disabled': !edit }]" :class="!edit ? 'radio-disabled' : ''"
@click="formData.ywcdxq = '是'" @click="edit ? formData.ywcdxq = '是': ''"
v-if="edit"> v-if="edit">
<view :class="['radio', { 'radio-checked': formData.ywcdxq === '是' }]"></view> <view :class="['radio', { 'radio-checked': formData.ywcdxq === '是' }]"></view>
<text></text> <text></text>
</view> </view>
<view <view class="radio-item"
:class="['radio-item', { 'radio-disabled': !edit }]" :class="!edit ? 'radio-disabled' : ''"
@click="formData.ywcdxq = '否'" @click="edit ? formData.ywcdxq = '否': ''"
v-if="edit"> v-if="edit">
<view :class="['radio', { 'radio-checked': formData.ywcdxq === '否' }]"></view> <view :class="['radio', { 'radio-checked': formData.ywcdxq === '否' }]"></view>
<text></text> <text></text>
@@ -54,26 +54,43 @@
</view> </view>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="场地面积" name="cdmj"> <uni-forms-item label="场地面积" name="cdmj">
<input :disabled="!edit" v-model="formData.cdmj" border="none" <input class="input-area" :disabled="!edit" v-model="formData.cdmj" border="none"
placeholder="请输入"/> placeholder="请输入"/>
<!-- <u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon> --> <!-- <u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon> -->
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="办公人数" name="bgrs"> <uni-forms-item label="办公人数" name="bgrs">
<input :disabled="!edit" v-model="formData.bgrs" border="none" <input class="input-area" :disabled="!edit" v-model="formData.bgrs" border="none"
placeholder="请输入"/> placeholder="请输入"/>
<!-- <u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon> --> <!-- <u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon> -->
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="办公位置" name="bgdd"> <uni-forms-item label="办公位置" name="bgdd">
<input :disabled="!edit" v-model="formData.bgdd" border="none" <input class="input-area" :disabled="!edit" v-model="formData.bgdd" border="none"
placeholder="请输入"/> placeholder="请输入"/>
<!-- <u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon> --> <!-- <u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon> -->
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="有无创业培训需求" name="ywcypxxq" required> <uni-forms-item label="有无创业培训需求" name="ywcypxxq" required>
<radio-group :disabled="!edit" :value="formData.ywcypxxq" <!-- <radio-group :disabled="!edit" :value="formData.ywcypxxq"
placement="row"> placement="row">
<radio :customStyle="{marginRight: '16px'}" label="是" value="是"></radio> <radio :customStyle="{marginRight: '16px'}" label="是" value="是"></radio>
<radio :customStyle="{marginRight: '16px'}" label="否" value="否"></radio> <radio :customStyle="{marginRight: '16px'}" label="否" value="否"></radio>
</radio-group> </radio-group> -->
<view class="radio-group">
<view class="radio-item"
:class="!edit ? 'radio-disabled' : ''"
@click="edit ? formData.ywcypxxq = '是' : ''"
v-if="edit">
<view :class="['radio', { 'radio-checked': formData.ywcypxxq === '是' }]"></view>
<text></text>
</view>
<view class="radio-item"
:class="!edit ? 'radio-disabled' : ''"
@click="edit ? formData.ywcypxxq = '否' : ''"
v-if="edit">
<view :class="['radio', { 'radio-checked': formData.ywcypxxq === '否' }]"></view>
<text></text>
</view>
<view v-else>{{ formData.ywcypxxq }}</view>
</view>
</uni-forms-item> </uni-forms-item>
<!-- <uni-forms-item label="是否意向接受创业培训" name="isInterestedEntrepreneurshipGuidance" required>--> <!-- <uni-forms-item label="是否意向接受创业培训" name="isInterestedEntrepreneurshipGuidance" required>-->
<!-- <radio-group :disabled="!edit" v-model="formData.isInterestedEntrepreneurshipGuidance"--> <!-- <radio-group :disabled="!edit" v-model="formData.isInterestedEntrepreneurshipGuidance"-->
@@ -83,13 +100,30 @@
<!-- </radio-group>--> <!-- </radio-group>-->
<!-- </uni-forms-item>--> <!-- </uni-forms-item>-->
<uni-forms-item label="有无资金需求" name="ywzjxq" required> <uni-forms-item label="有无资金需求" name="ywzjxq" required>
<radio-group :disabled="!edit" :value="formData.ywzjxq" placement="row"> <!-- <radio-group :disabled="!edit" :value="formData.ywzjxq" placement="row">
<radio :customStyle="{marginRight: '16px'}" label="是" value="是">是</radio> <radio :customStyle="{marginRight: '16px'}" label="是" value="是">是</radio>
<radio :customStyle="{marginRight: '16px'}" label="否" value="否">否</radio> <radio :customStyle="{marginRight: '16px'}" label="否" value="否">否</radio>
</radio-group> </radio-group> -->
<view class="radio-group">
<view class="radio-item"
:class="!edit ? 'radio-disabled' : ''"
@click="edit ? formData.ywzjxq = '是' : ''"
v-if="edit">
<view :class="['radio', { 'radio-checked': formData.ywzjxq === '是' }]"></view>
<text>是</text>
</view>
<view class="radio-item"
:class="!edit ? 'radio-disabled' : ''"
@click="edit ? formData.ywzjxq = '否' : ''"
v-if="edit">
<view :class="['radio', { 'radio-checked': formData.ywzjxq === '否' }]"></view>
<text>否</text>
</view>
<view v-else>{{ formData.ywzjxq }}</view>
</view>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="需求说明" name="jobDescription" required> <uni-forms-item label="需求说明" name="jobDescription" required>
<textarea :disabled="!edit" v-model="formData.jobDescription" placeholder="请输入"></textarea> <textarea style="width: 100%;box-sizing: border-box;" class="textarea" :disabled="!edit" v-model="formData.jobDescription" placeholder="请输入"></textarea>
</uni-forms-item> </uni-forms-item>
<!-- <uni-forms-item label="希望解决日期" name="hopeSolveDate" required> <!-- <uni-forms-item label="希望解决日期" name="hopeSolveDate" required>
<view style="width: 100%;" @click="showPicker('hopeSolveDate')" <view style="width: 100%;" @click="showPicker('hopeSolveDate')"
@@ -494,6 +528,44 @@
background-color: #fff; background-color: #fff;
} }
.input-area{
padding: 0 24rpx;
height: 64rpx;
display: flex;
align-items: center;
border: 1px solid #e4e4e4;
border-radius: 8rpx;
box-sizing: border-box;
// &input{
// }
}
textarea{
box-sizing: border-box;
border: 1px solid #e4e4e4;
border-radius: 8rpx;
font-size: 26rpx;
padding: 12rpx;
}
.picker-view {
display: flex;
align-items: center;
justify-content: space-between;
// width: 100%;
padding: 0 24rpx;
height: 64rpx;
display: flex;
align-items: center;
background: #ffffff;
border: 2rpx solid #e5e5e5;
border-radius: 12rpx;
box-sizing: border-box;
transition: all 0.3s ease;
}
.disabledLine { .disabledLine {
background: rgb(245, 247, 250); background: rgb(245, 247, 250);
cursor: not-allowed; cursor: not-allowed;

View File

@@ -1,7 +1,7 @@
<!-- <!--
* @Date: 2024-10-08 14:29:36 * @Date: 2024-10-08 14:29:36
* @LastEditors: shirlwang * @LastEditors: shirlwang
* @LastEditTime: 2025-11-04 17:32:32 * @LastEditTime: 2025-11-06 12:09:01
--> -->
<template> <template>
@@ -10,23 +10,20 @@
<view class="inner"> <view class="inner">
<view class="part-title" style="display: flex;justify-content: space-between;">求职需求信息 <view class="part-title" style="display: flex;justify-content: space-between;">求职需求信息
<view v-if="!edit&&formData.id&&formData.currentStatus!=3" class="btn" <view v-if="!edit&&formData.id&&formData.currentStatus!=3" class="btn"
style="font-weight: normal;display: flex;" @click="edit=true">编辑<u-icon name="edit-pen" style="font-weight: normal;display: flex;" @click="edit=true">编辑</view>
color="#A6A6A6"></u-icon></view>
</view> </view>
<view class="inner-part"> <view class="inner-part">
<uni-forms labelPosition="left" :model="formData" :rules="rules" ref="uForm" class="self-form" labelWidth="100"> <uni-forms labelPosition="right" :model="formData" :rules="rules" ref="uForm" class="self-form" label-width="150rpx">
<!-- v-if="$store.getters.roles.includes('shequn') || $store.getters.roles.includes('gly')" --> <!-- v-if="$store.getters.roles.includes('shequn') || $store.getters.roles.includes('gly')" -->
<uni-forms-item label="姓名" name="personName" required <uni-forms-item label="姓名" name="personName" required>
> <view v-if="name" style="width: calc(100% - 150rpx);overflow: hidden;text-overflow: ellipsis;white-space: nowrap;box-sizing: border-box;"
<view v-if="name" style="width: 100%;" class="input-area disabledLine">
class="disabledLine">
{{ formData.personName || '请选择' }} {{ formData.personName || '请选择' }}
</view> </view>
<view v-else style="width: 100%;" @click="openPersonChooser" <view class="input-area" v-else @click="openPersonChooser" style="width: calc(100% - 150rpx);overflow: hidden;text-overflow: ellipsis;white-space: nowrap;box-sizing: border-box;"
:class="{disabledLine: !edit||!canChoosePerson, noValue: !formData.personName}"> :class="{disabledLine: !edit||!canChoosePerson, noValue: !formData.personName}">
{{ formData.personName || '请选择' }} {{ formData.personName || '请选择' }}
</view> </view>
<u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="求职工种" name="jobWorkType"> <uni-forms-item label="求职工种" name="jobWorkType">
<picker <picker
@@ -40,7 +37,6 @@
> >
<view class="picker-view"> <view class="picker-view">
<text>{{ formData.jobWorkTypeName || '请选择工种' }}</text> <text>{{ formData.jobWorkTypeName || '请选择工种' }}</text>
<u-icon name="arrow-down" color="#999999"></u-icon>
</view> </view>
</picker> </picker>
<view v-else class="picker-view"> <view v-else class="picker-view">
@@ -48,24 +44,22 @@
</view> </view>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="最低薪酬" name="minRecruitmentSalary" required> <uni-forms-item label="最低薪酬" name="minRecruitmentSalary" required>
<input :disabled="!edit" v-model="formData.minRecruitmentSalary" border="none" <input class="input-area" :disabled="!edit" v-model="formData.minRecruitmentSalary" border="none"
placeholder="请输入"/> placeholder="请输入"/>
<u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="最高薪酬" name="highRecruitmentSalary" required> <uni-forms-item label="最高薪酬" name="highRecruitmentSalary" required>
<input :disabled="!edit" v-model="formData.highRecruitmentSalary" border="none" <input class="input-area" :disabled="!edit" v-model="formData.highRecruitmentSalary" border="none"
placeholder="请输入"/> placeholder="请输入"/>
<u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="希望工作地点" name="addressDesc"> <uni-forms-item label="希望工作地点" name="addressDesc">
<view class="df_flex df_flex_1"> <view class="df_flex df_flex_1">
<input placeholder="请输入" border="none" v-model="formData.addressDesc" <input placeholder="请输入" border="none" v-model="formData.addressDesc"
class="ellipsis_1" @focus="$refs.placePicker.openDialog()"/> class="ellipsis_1 input-area" @focus="$refs.placePicker.openDialog()"/>
</view> </view>
</uni-forms-item> </uni-forms-item>
<uni-forms labelPosition="left" class="self-form" labelWidth="110" > <uni-forms labelPosition="left" class="self-form" labelWidth="110" >
<uni-forms-item label="求职说明" name="jobDescription" required > <uni-forms-item label="求职说明" name="jobDescription" required >
<textarea :disabled="!edit" v-model="formData.jobDescription" <textarea style="width: 100%;box-sizing: border-box;" class="textarea" :disabled="!edit" v-model="formData.jobDescription"
placeholder="请输入" ></textarea> placeholder="请输入" ></textarea>
</uni-forms-item> </uni-forms-item>
</uni-forms> </uni-forms>
@@ -691,6 +685,25 @@
cursor: not-allowed; cursor: not-allowed;
} }
.input-area{
padding: 0 24rpx;
height: 64rpx;
display: flex;
align-items: center;
border: 1px solid #e4e4e4;
border-radius: 8rpx;
box-sizing: border-box;
// &input{
// }
}
textarea{
box-sizing: border-box;
border: 1px solid #e4e4e4;
border-radius: 8rpx;
font-size: 26rpx;
padding: 12rpx;
}
@@ -699,12 +712,14 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
width: 100%; // width: 100%;
padding: 28rpx 36rpx; padding: 0 24rpx;
height: 64rpx;
display: flex;
align-items: center;
background: #ffffff; background: #ffffff;
border: 2rpx solid #e5e5e5; border: 2rpx solid #e5e5e5;
border-radius: 12rpx; border-radius: 12rpx;
min-height: 88rpx;
box-sizing: border-box; box-sizing: border-box;
transition: all 0.3s ease; transition: all 0.3s ease;
} }

View File

@@ -1,7 +1,7 @@
<!-- <!--
* @Date: 2024-10-08 14:29:36 * @Date: 2024-10-08 14:29:36
* @LastEditors: shirlwang * @LastEditors: shirlwang
* @LastEditTime: 2025-11-05 08:57:34 * @LastEditTime: 2025-11-06 12:09:11
--> -->
<template> <template>
@@ -14,11 +14,11 @@
color="#A6A6A6"></u-icon></view> color="#A6A6A6"></u-icon></view>
</view> </view>
<view class="inner-part"> <view class="inner-part">
<uni-forms labelPosition="left" :model="formData" :rules="rules" ref="uForm" class="self-form" <uni-forms labelPosition="right" :model="formData" :rules="rules" ref="uForm" class="self-form"
labelWidth="100"> labelWidth="150rpx">
<uni-forms-item label="姓名" prop="personName" required <uni-forms-item label="姓名" prop="personName" required
v-if="$store.getters.roles.includes('shequn')|| $store.getters.roles.includes('gly')"> v-if="$store.getters.roles.includes('shequn')|| $store.getters.roles.includes('gly')">
<view style="width: 100%;" @click="openPersonChooser" <view class="input-area" style="width: 100%;" @click="openPersonChooser"
:class="{disabledLine: !edit||!canChoosePerson, noValue: !formData.personName}"> :class="{disabledLine: !edit||!canChoosePerson, noValue: !formData.personName}">
{{ formData.personName || '请选择' }} {{ formData.personName || '请选择' }}
</view> </view>
@@ -26,7 +26,7 @@
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="需求说明" prop="jobDescription" required> <uni-forms-item label="需求说明" prop="jobDescription" required>
<textarea :disabled="!edit" v-model="formData.jobDescription" placeholder="请输入"></textarea> <textarea style="width: 100%;box-sizing: border-box;" class="textarea" :disabled="!edit" v-model="formData.jobDescription" placeholder="请输入"></textarea>
</uni-forms-item> </uni-forms-item>
</uni-forms> </uni-forms>
</view> </view>
@@ -338,6 +338,44 @@
color: rgb(192, 196, 204); color: rgb(192, 196, 204);
} }
.input-area{
padding: 0 24rpx;
height: 64rpx;
display: flex;
align-items: center;
border: 1px solid #e4e4e4;
border-radius: 8rpx;
box-sizing: border-box;
// &input{
// }
}
textarea{
box-sizing: border-box;
border: 1px solid #e4e4e4;
border-radius: 8rpx;
font-size: 26rpx;
padding: 12rpx;
}
.picker-view {
display: flex;
align-items: center;
justify-content: space-between;
// width: 100%;
padding: 0 24rpx;
height: 64rpx;
display: flex;
align-items: center;
background: #ffffff;
border: 2rpx solid #e5e5e5;
border-radius: 12rpx;
box-sizing: border-box;
transition: all 0.3s ease;
}
.disabledLine { .disabledLine {
background: rgb(245, 247, 250); background: rgb(245, 247, 250);
cursor: not-allowed; cursor: not-allowed;

View File

@@ -1,7 +1,7 @@
<!-- <!--
* @Date: 2024-10-08 14:29:36 * @Date: 2024-10-08 14:29:36
* @LastEditors: shirlwang * @LastEditors: shirlwang
* @LastEditTime: 2025-11-04 17:45:50 * @LastEditTime: 2025-11-06 12:15:08
--> -->
<template> <template>
@@ -14,11 +14,11 @@
color="#A6A6A6"></u-icon></view> color="#A6A6A6"></u-icon></view>
</view> </view>
<view class="inner-part"> <view class="inner-part">
<uni-forms labelPosition="left" :model="formData" :rules="rules" ref="uForm" class="self-form" <uni-forms labelPosition="right" :model="formData" :rules="rules" ref="uForm" class="self-form"
labelWidth="120"> labelWidth="150rpx">
<uni-forms-item label="姓名" prop="personName" required <uni-forms-item label="姓名" prop="personName" required
v-if="$store.getters.roles.includes('shequn'|| $store.getters.roles.includes('gly'))"> v-if="$store.getters.roles.includes('shequn'|| $store.getters.roles.includes('gly'))">
<view style="width: 100%;" @click="openPersonChooser" <view class="input-area" style="width: 100%;" @click="openPersonChooser"
:class="{disabledLine: !edit||!canChoosePerson, noValue: !formData.personName}"> :class="{disabledLine: !edit||!canChoosePerson, noValue: !formData.personName}">
{{ formData.personName || '请选择' }} {{ formData.personName || '请选择' }}
</view> </view>
@@ -62,7 +62,7 @@
</uni-forms> </uni-forms>
<uni-forms labelPosition="left" class="self-form" labelWidth="110"> <uni-forms labelPosition="left" class="self-form" labelWidth="110">
<uni-forms-item label="需求说明" prop="jobDescription"> <uni-forms-item label="需求说明" prop="jobDescription">
<textarea :disabled="!edit" v-model="formData.jobDescription" placeholder="请输入"></textarea> <textarea style="width: 100%;box-sizing: border-box;" class="textarea" :disabled="!edit" v-model="formData.jobDescription" placeholder="请输入"></textarea>
</uni-forms-item> </uni-forms-item>
</uni-forms> </uni-forms>
</view> </view>
@@ -568,33 +568,42 @@
border-radius: 4px; border-radius: 4px;
} }
.picker-view { .input-area{
display: flex; padding: 0 24rpx;
align-items: center; height: 64rpx;
justify-content: space-between; display: flex;
width: 100%; align-items: center;
padding: 28rpx 36rpx; border: 1px solid #e4e4e4;
background: #ffffff; border-radius: 8rpx;
border: 2rpx solid #e5e5e5; box-sizing: border-box;
border-radius: 12rpx; // &input{
min-height: 88rpx;
box-sizing: border-box; // }
transition: all 0.3s ease; }
} textarea{
box-sizing: border-box;
border: 1px solid #e4e4e4;
border-radius: 8rpx;
font-size: 26rpx;
padding: 12rpx;
}
.picker-view:active {
background: #f8f9fa;
border-color: #007aff;
}
.picker-view text {
color: #333333;
font-size: 28rpx;
flex: 1;
}
.picker-view .u-icon {
margin-left: 16rpx; .picker-view {
color: #999999; display: flex;
} align-items: center;
justify-content: space-between;
// width: 100%;
padding: 0 24rpx;
height: 64rpx;
display: flex;
align-items: center;
background: #ffffff;
border: 2rpx solid #e5e5e5;
border-radius: 12rpx;
box-sizing: border-box;
transition: all 0.3s ease;
}
</style> </style>

View File

@@ -0,0 +1,287 @@
<template>
<uni-popup background-color="#fff" type="bottom"
ref="openDeal"
style="position: relative; z-index: 100"
>
<view style="padding: 32rpx;">
<uni-forms style="width: 100%;"
class="self-form"
labelPosition="top"
:model="formData"
:rules="rules"
ref="uForm"
labelWidth="300"
>
<uni-forms-item label="实际解决时间" prop="actualSolveDate" required>
<view
class="picker-view"
:class="{ selected: formData.actualSolveDate }"
>
<uni-datetime-picker
type="date"
:value="formData.actualSolveDate"
start="2021-3-20"
end="2030-6-20"
@change="change"
/>
</view>
</uni-forms-item>
<uni-forms-item label="经办人" prop="agentUserName" required>
<view class="input-view">
<uni-data-select
style="width: 100%"
v-model="formData.agentUserId"
placeholder="请选择经办人"
:localdata="jingbrList1"
@change="handleAgentChange"
>
</uni-data-select>
</view>
</uni-forms-item>
<uni-forms-item label="人员状态" prop="personStatus">
<picker
@change="onpersonStatusChange"
:range="personStatusOptions.map(item => item.label)"
:value="getpersonStatusIndex(formData.personStatus)"
mode="selector"
>
<view style="border: 1px solid #e4e4e4;width: 100%;box-sizing: border-box;padding: 0 20rpx;line-height: 64rpx;white-space: nowrap;text-overflow: ellipsis;flex-grow: 1;">{{ getpersonStatusLabel(formData.personStatus) || "请选择" }}</view>
</picker>
</uni-forms-item>
<uni-forms-item label="附件" prop="fileUrl">
<ImageUpload
:fileList="fileList"
@update="changeFile"
:maxCount="6"
/>
</uni-forms-item>
<uni-forms-item label="解决说明" prop="solveDesc" required>
<view class="textarea-view">
<textarea
v-model="formData.solveDesc"
placeholder="请输入解决说明"
style="width: 100%;padding: 28rpx 36rpx;border: 1px solid #e4e4e4;padding: 10rpx;border-radius: 8rpx;font-size: 28rpx;color:#333333;height: 120rpx;"
></textarea>
</view>
</uni-forms-item>
</uni-forms>
</view>
<view class="button-area">
<view class="btn" @click="closeopenDeal">取消</view>
<view
class="btn reset"
@click="
formData.actualSolveDate = '';
formData.solveDesc = '';
"
>重置</view
>
<view class="btn save" @click="finishJobRecommend(needsType)"
>办结</view
>
</view>
</uni-popup>
</template>
<script>
import ImageUpload from "@/packageRc/components/ImageUpload";
import { requirementCompletion } from "@/apiRc/company/index";
import {getJbrInfo} from "@/apiRc/personinfo/index"
export default {
components: {
ImageUpload,
},
data() {
return {
formData: {
actualSolveDate: '',
agentUserId: '',
personStatus: '',
fileUrl: '',
solveDesc: ''
},
fileList: [],
personStatusOptions: [],
rules: {
actualSolveDate: [
{
required: true,
message: "请选择实际解决时间",
trigger: ["blur", "change"],
},
],
agentUserName: [
{
required: true,
message: "请填写经办人",
trigger: ["blur", "change"],
},
],
personStatus: [
{
required: true,
message: "请填写人员状态",
trigger: ["blur", "change"],
},
],
solveDesc: [
{
required: true,
message: "请填写解决说明",
trigger: ["blur", "change"],
},
],
},
}
},
created() {
this.$getDict('qcjy_ryzt').then(res => {
if (res.data && Array.isArray(res.data)) {
this.personStatusOptions = res.data.map(item => ({
value: item.dictValue,
label: item.dictLabel
}));
}
});
getJbrInfo().then(res => {
this.jingbrList1=res.map(ele => {
return {
value: ele.userId,
text: ele.nickName
}
})
})
},
methods: {
init(formData) {
this.formData = formData;
this.$nextTick(() => {
this.$refs.openDeal.open()
})
},
// 获取帮扶内容标签
getpersonStatusLabel(value) {
let arr = this.personStatusOptions.filter(item => item.value == value)
return arr.length ? arr[0].label : ''
},
getpersonStatusIndex(value) {
if (!value) return 0;
const index = this.personStatusOptions.findIndex(item => item.value === value);
return index !== -1 ? index : 0;
},
// 处理人员状态选择变化
onpersonStatusChange(e) {
const index = e.detail.value;
if (this.personStatusOptions && this.personStatusOptions[index]) {
this.formData.personStatus = this.personStatusOptions[index].value;
}
},
// 获取经办人名称
getAgentUserName(userId) {
const agent = this.jingbrList1.find(item => item.value === userId);
return agent ? agent.nickName : '';
},
// 处理经办人选择变化
handleAgentChange(value) {
if (!value || !this.jingbrList1 || !this.jingbrList1.length) {
this.formData.agentUserName = '';
return;
}
const user = this.jingbrList1.find(item => item.value === value);
if (user) {
this.formData.agentUserName = user.nickName;
} else {
this.formData.agentUserName = '';
}
},
// 办结按钮
async finishJobRecommend() {
uni.showLoading();
try {
// 先进行表单校验
this.$refs.uForm.validate().then(res => {
console.log('res', res);
// 校验通过后再走后续逻辑
const url = "/manage/personDemand/demandDone";
requirementCompletion(url, this.formData).then(res => {
if (res.code === 200) {
uni.showToast({title: '办结成功', icon: 'none'});
this.$refs.openDeal.close();
this.$emit('finished')
}
})
}).catch((error) => {
console.log(error)
})
} catch (error) {
let msg = '';
if (error && error[0] && error[0].message) {
msg = error[0].message;
} else if (error && error.message) {
msg = error.message;
} else if (typeof error === 'string') {
msg = error;
} else {
msg = '请检查必填项填写';
}
uni.showToast({title: msg, icon: 'none'});
} finally {
uni.hideLoading();
}
},
changeFile(e) {
// 清空当前的 fileUrl 数组
this.formData.fileUrl = [];
// 如果 e 有长度(即用户选择了文件)
if (e.length) {
// 遍历每个文件对象并获取其 url
for (let data of e) {
const url = data.data ? data.data.url : data.url;
this.formData.fileUrl.push(url);
}
}
this.formData.fileUrl = this.formData.fileUrl.join(',')
},
change(e) {
this.formData.actualSolveDate = e
},
}
}
</script>
<style lang="scss" scoped>
.button-area {
padding: 24rpx 32rpx 68rpx;
background: #fff;
display: flex;
box-sizing: border-box;
border-radius: 16px 16px 0px 0px;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
.btn {
line-height: 72rpx;
width: 176rpx;
margin-right: 16rpx;
font-size: 28rpx;
border: 1px solid #b8c5d4;
color: #282828;
text-align: center;
border-radius: 8rpx;
}
.reset {
background: #dce2e9;
}
.save {
background: linear-gradient(103deg, #1d64cf 0%, #1590d4 99%);
color: #fff;
border: 0;
flex-grow: 1;
}
}
</style>

View File

@@ -1,16 +1,9 @@
<template> <template>
<view class="page"> <view class="page" style="background-image: url('../../../packageRc/static/pageBg.png');">
<view class="page-header">
<view class="title df_flex" style="text-align: left;padding:50rpx 32rpx;">
<u-icon name="arrow-left" color="#fff" size="38rpx" @tap="$tab.navigateBack()"></u-icon>
<text style="margin-left: 30rpx;" class="df_flex_1">需求列表</text>
<u-icon v-show="$store.getters.roles.includes('shequn')" @tap="$store.commit('SET_SHOWEXITPOPUP', true)" name="list" size="44rpx" color="#fff"></u-icon>
</view>
</view>
<view class="input-outer-part" <view class="input-outer-part"
style="padding-top: 12rpx;margin-top: 16rpx;padding-bottom: 0;max-height: unset;"> style="padding: 24rpx 32rpx 0;max-height: unset;">
<view class="search-line"> <view class="search-line">
<u-input placeholder="请输入群众姓名进行搜索" v-model="queryParams.searchValue" border="none" /> <input style="width: 100%;" placeholder="请输入群众姓名进行搜索" v-model="queryParams.searchValue" border="none" />
<img src="https://rc.jinan.gov.cn/qcwjyH5/static/images/person/search.png" class="search-icon" @click="search()" /> <img src="https://rc.jinan.gov.cn/qcwjyH5/static/images/person/search.png" class="search-icon" @click="search()" />
</view> </view>
<view class="inner" <view class="inner"
@@ -20,11 +13,11 @@
<view v-if="total" style="position: relative;padding-bottom: 16px;color: #000;"> <view v-if="total" style="position: relative;padding-bottom: 16px;color: #000;">
<text> {{ total }} </text> <text> {{ total }} </text>
</view> </view>
<scroll-view :scroll-y="true" style="height: calc(100vh - 422rpx);position: relative;z-index: 1;" <scroll-view :scroll-y="true" style="height: calc(100vh - 342rpx);position: relative;z-index: 1;"
@scrolltolower="getBottomList"> @scrolltolower="getBottomList">
<u-swipe-action> <uni-swipe-action>
<u-swipe-action-item @click="clickDelete(item)" v-for="(item, index) in tableData" :key="index" <uni-swipe-action-item @click="clickDelete(item)" v-for="(item, index) in tableData" :key="index"
style="margin-bottom: 24rpx;border-radius: 16rpx;" :options="options1"> style="margin-bottom: 24rpx;border-radius: 16rpx;" :right-options="options1">
<view class="job-item"> <view class="job-item">
<view class="top-container" @click="goNeedsDetail(item)"> <view class="top-container" @click="goNeedsDetail(item)">
<view class="title-line"> <view class="title-line">
@@ -39,24 +32,24 @@
:class="item.currentStatus == 1 ? 'not' : item.currentStatus == 2 ? 'ing' : item.currentStatus == 3 ? 'finish' : '' "> :class="item.currentStatus == 1 ? 'not' : item.currentStatus == 2 ? 'ing' : item.currentStatus == 3 ? 'finish' : '' ">
{{ getDictLabel(item.currentStatus, currentStatusList) }} {{ getDictLabel(item.currentStatus, currentStatusList) }}
</text></view> </text></view>
<view class="info" v-if="queryParams.needsType == 1"> <view class="info" v-if="queryParams.demandType == 1">
<text>需求工种</text>{{ item.jobWorkTypeName }} <text>需求工种</text>{{ item.jobWorkTypeName }}
</view> </view>
<view class="info" v-if="queryParams.needsType == 3"> <view class="info" v-if="queryParams.demandType == 3">
<text>需求名称</text>{{ item.serviceRequirementTitle }} <text>需求名称</text>{{ item.serviceRequirementTitle }}
</view> </view>
<view class="info" <view class="info"
v-if="queryParams.needsType == 2||queryParams.needsType == 4||queryParams.needsType == 5"> v-if="queryParams.demandType == 2||queryParams.demandType == 4||queryParams.demandType == 5">
<text>需求名称</text>{{ item.demandTitle }} <text>需求名称</text>{{ item.demandTitle }}
</view> </view>
</view> </view>
<!-- <!--
item.currentStatus = 1 待处理2 处理中 3 已完成 item.currentStatus = 1 待处理2 处理中 3 已完成
queryParams.needsType 1 求职需求 2 援助需求 3 创业需求 4 培训需求 5其他需求 展示办结按钮 queryParams.demandType 1 求职需求 2 援助需求 3 创业需求 4 培训需求 5其他需求 展示办结按钮
item.currentStatus = 1待处理 item.currentStatus = 2 处理中 item.currentStatus = 1待处理 item.currentStatus = 2 处理中
求职需求列表(queryParams.needsType = 1) 展示 推荐办理 求职需求列表(queryParams.demandType = 1) 展示 推荐办理
培训需求列表(queryParams.needsType = 4) 展示 培训办理 培训需求列表(queryParams.demandType = 4) 展示 培训办理
援助创业其他列表 展示办理 援助创业其他列表 展示办理
item.currentStatus = 3 已完成 item.currentStatus = 3 已完成
统一展示 服务追溯 统一展示 服务追溯
@@ -65,39 +58,39 @@
<view class="item_btn df_flex df_align_center df_justify_center"> <view class="item_btn df_flex df_align_center df_justify_center">
<!-- 需求已处理完成的 展示服务追溯 --> <!-- 需求已处理完成的 展示服务追溯 -->
<view v-if="item.currentStatus == 3" class="df_flex_1"> <view v-if="item.currentStatus == 3" class="df_flex_1">
<u-button type="primary" :plain="true" color="#BF5818" text="服务追溯" <view type="primary" :plain="true" color="#BF5818" text="服务追溯"
@click="serviceTraceButton(item)" :customStyle="{border: 'none'}"></u-button> @click="serviceTraceButton(item)" :customStyle="{border: 'none'}">服务追溯</view>
</view> </view>
<!-- 需求处于待处理处理中 --> <!-- 需求处于待处理处理中 -->
<view v-else class="df_flex_1"> <view v-else class="df_flex_1">
<!-- 求职需求 --> <!-- 求职需求 -->
<view v-if="queryParams.needsType == 1" class="df_flex"> <view v-if="queryParams.demandType == 1" class="df_flex">
<u-button type="primary" :plain="true" color="#BF5818" text="推荐" <view type="primary" :plain="true" color="#BF5818" text="推荐"
:customStyle="{border: 'none'}" :customStyle="{border: 'none'}"
@click="requirementTraining(item, 1)"></u-button> @click="requirementTraining(item, 1)">推荐</view>
<view class="line"></view> <view class="line"></view>
<u-button type="primary" :plain="true" color="#BF5818" text="办理" <view type="primary" :plain="true" color="#BF5818" text="办理"
:customStyle="{border: 'none'}" @click="requirementHandling(item)"></u-button> :customStyle="{border: 'none'}" @click="requirementHandling(item)">办理</view>
</view> </view>
<!-- 培训需求 --> <!-- 培训需求 -->
<view v-else-if="queryParams.needsType == 4" class="df_flex"> <view v-else-if="queryParams.demandType == 4" class="df_flex">
<u-button type="primary" :plain="true" color="#BF5818" text="培训" <view type="primary" :plain="true" color="#BF5818" text="培训"
:customStyle="{border: 'none'}" :customStyle="{border: 'none'}"
@click="requirementTraining(item, 4)"></u-button> @click="requirementTraining(item, 4)">培训</view>
<view class="line"></view> <view class="line"></view>
<u-button type="primary" :plain="true" color="#BF5818" text="办理" <view type="primary" :plain="true" color="#BF5818" text="办理"
:customStyle="{border: 'none'}" @click="requirementHandling(item)"></u-button> :customStyle="{border: 'none'}" @click="requirementHandling(item)">办理</view>
</view> </view>
<!-- 其他需求 --> <!-- 其他需求 -->
<view v-else> <view v-else>
<u-button type="primary" :plain="true" color="#BF5818" text="办理" <view type="primary" :plain="true" color="#BF5818" text="办理"
:customStyle="{border: 'none'}" @click="requirementHandling(item)"></u-button> :customStyle="{border: 'none'}" @click="requirementHandling(item)">办理</view>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</u-swipe-action-item> </uni-swipe-action-item>
</u-swipe-action> </uni-swipe-action>
<view style="padding-bottom: 24rpx;"> <view style="padding-bottom: 24rpx;">
<img v-if="!total&&!loading" src="https://rc.jinan.gov.cn/qcwjyH5/static/images/person/empty.png" <img v-if="!total&&!loading" src="https://rc.jinan.gov.cn/qcwjyH5/static/images/person/empty.png"
style="width: 100%;display: block;margin: 0 auto;" /> style="width: 100%;display: block;margin: 0 auto;" />
@@ -110,30 +103,35 @@
</view>   </view>  
</scroll-view> </scroll-view>
</view> </view>
<u-popup :show="openDeal" style="position: relative;z-index: 100;" closeOnClickOverlay @close="openDeal=false"> <DealDone ref="dealDone" @finished="search();"/>
<u--form class="self-form" labelPosition="top" :model="formData" :rules="rules" ref="uForm" <!-- <uni-popup ref="openDeal" background-color="#fff" type="bottom">
labelWidth="300"> <view style="padding: 32rpx;padding-bottom: 0">
<u-form-item label="实际解决时间" prop="actualSolveDate" required> <uni-forms class="self-form" labelPosition="top" :model="formData" :rules="rules" ref="uForm"
<view class="bordered" style="width: 100%;" @click="showTime=true" labelWidth="300">
:class="{noValue: !formData.actualSolveDate}">{{ formData.actualSolveDate||'请选择' }}</view> <uni-forms-item label="实际解决时间" prop="actualSolveDate" required>
<u-icon slot="right" name="arrow-down" color="#A6A6A6"></u-icon> <picker style="width: 100%;" mode="date" :value="formData.actualSolveDate" start="1900-01-01" end="2100-12-31" @change="onDateChange">
</u-form-item> <view class="date-picker-wrapper" :class="{ noValue: !formData.actualSolveDate }">
<view v-if="formData.actualSolveDate" class="date-value">{{ formData.actualSolveDate }}</view>
<view v-else>请选择</view>
</view>
</picker>
</uni-forms-item>
<u-form-item label="附件" prop="fileUrl" > <uni-forms-item label="附件" prop="fileUrl" >
<ImageUpload :fileList="fileList" @update="changeFile" :maxCount="6" /> <ImageUpload :fileList="fileList" @update="changeFile" :maxCount="6" />
</u-form-item> </uni-forms-item>
<u-form-item label="解决说明" prop="solveDesc" required> <uni-forms-item label="解决说明" prop="solveDesc" required>
<u-textarea v-model="formData.solveDesc" placeholder="请输入"></u-textarea> <textarea style="border: 1px solid #e4e4e4;width: 100%;border-radius: 8rpx;padding: 24rpx;box-sizing: border-box;" v-model="formData.solveDesc" placeholder="请输入"></textarea>
<u-icon slot="right" name="edit-pen" color="#A6A6A6"></u-icon> </uni-forms-item>
</u-form-item> </uni-forms>
</u--form> </view>
<view class="button-area"> <view class="button-area" style="box-shadow: unset;border-top: 1px solid #e4e4e4;padding-bottom: 0;">
<view class="btn" @click="openDeal = false">取消</view> <view class="btn" @click="closeopenDeal">取消</view>
<view class="btn reset" @click="formData.actualSolveDate = '';formData.solveDesc = ''">重置</view> <view class="btn reset" @click="formData.actualSolveDate = '';formData.solveDesc = ''">重置</view>
<view class="btn save" @click="finishJobRecommend">办结</view> <view class="btn save" @click="finishJobRecommend">办结</view>
</view> </view>
</u-popup> </uni-popup> -->
<view class="addNeeds" @click="goAddNeeds()"> <view class="addNeeds" @click="goAddNeeds()">
<img src="https://rc.jinan.gov.cn/qcwjyH5/static/images/person/addNeeds.png" /> <img src="https://rc.jinan.gov.cn/qcwjyH5/static/images/person/addNeeds.png" />
</view> </view>
@@ -142,7 +140,7 @@
@cancel="showTime=false"></u-datetime-picker> --> @cancel="showTime=false"></u-datetime-picker> -->
<u-datetime-picker <!-- <u-datetime-picker
style="position: relative;z-index: 100;" style="position: relative;z-index: 100;"
:show="showTime" :show="showTime"
v-model="hopeSolveDate" v-model="hopeSolveDate"
@@ -151,7 +149,7 @@
@confirm="confirmDate" @confirm="confirmDate"
@cancel="showTime=false" @cancel="showTime=false"
@close="showTime=false" @close="showTime=false"
></u-datetime-picker> ></u-datetime-picker> -->
<!-- 社区端 - 显示隐藏退出组件 --> <!-- 社区端 - 显示隐藏退出组件 -->
@@ -159,7 +157,7 @@
</view> </view>
</template> </template>
<script> <script>
import PopupList from "packageRc/components/PopupLists.vue"; import PopupList from "/packageRc/components/PopupLists.vue";
import ImageUpload from '/packageRc/components/ImageUpload' import ImageUpload from '/packageRc/components/ImageUpload'
import { import {
requirementCompletion requirementCompletion
@@ -187,10 +185,12 @@
delOtherService, delOtherService,
finishOtherService finishOtherService
} from '@/apiRc/needs/otherService' } from '@/apiRc/needs/otherService'
import DealDone from './dealDone.vue'
export default { export default {
components: { components: {
PopupList, PopupList,
ImageUpload ImageUpload,
DealDone,
}, },
data() { data() {
return { return {
@@ -201,7 +201,7 @@
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
needsType: 1 demandType: 1
}, },
total: 0, total: 0,
showMorePage: true, showMorePage: true,
@@ -234,16 +234,23 @@
onLoad({ onLoad({
dictValue dictValue
}) { }) {
this.queryParams.needsType = dictValue this.queryParams.demandType = dictValue || 1
this.getCheckData() this.getCheckData()
}, },
onShow() { onShow() {
this.search(); this.search();
}, },
methods: { methods: {
// 日期选择变化处理
onDateChange(e) {
this.formData.actualSolveDate = e.detail.value;
},
closeopenDeal() {
this.$refs.openDeal.close()
},
// 新增需求 // 新增需求
goAddNeeds() { goAddNeeds() {
this.$tab.navigateTo(`/pages/needs/needDetail?activeType=${this.queryParams.needsType}&showTab=1`) uni.navigateTo(`/packageRc/pages/needs/needDetail?activeType=${this.queryParams.demandType}&showTab=1`)
}, },
confirmDate(e) { confirmDate(e) {
@@ -259,36 +266,36 @@
// 需求推荐/培训 // 需求推荐/培训
requirementTraining(item, index) { requirementTraining(item, index) {
if (index == 1) { if (index == 1) {
uni.navigateTo( uni.navigateTo({
`/pages/services/serviceDetail?personName=${item.personName}&personId=${item.personId}&jobDemandInfoId=${item.id}&jobWorkType=${item.jobWorkType}&type=3&showTab=1` url: `/packageRc/pages/service/serviceDetail?personName=${item.personName}&personId=${item.personId}&jobDemandInfoId=${item.id}&jobWorkType=${item.jobWorkType}&type=3&showTab=1`
) })
} else { } else {
uni.navigateTo( uni.navigateTo({
`/pages/services/serviceDetail?personName=${item.personName}&personId=${item.personId}&skillTrainingId=${item.id}&personStatus=${item.personStatus}&type=4&showTab=1` url: `/packageRc/pages/service/serviceDetail?personName=${item.personName}&personId=${item.personId}&skillTrainingId=${item.id}&personStatus=${item.personStatus}&type=4&showTab=1`
) })
} }
}, },
clickDelete(item) { clickDelete(item) {
this.loading = true; this.loading = true;
if (this.queryParams.needsType == 1) { if (this.queryParams.demandType == 1) {
delJobService(item.id).then((res) => { delJobService(item.id).then((res) => {
this.deleteFinish(res) this.deleteFinish(res)
}); });
} else if (this.queryParams.needsType == 2) { } else if (this.queryParams.demandType == 2) {
delAssistService(item.id).then((res) => { delAssistService(item.id).then((res) => {
this.deleteFinish(res) this.deleteFinish(res)
}); });
} else if (this.queryParams.needsType == 3) { } else if (this.queryParams.demandType == 3) {
delEntrepreneurshipService(item.id).then((res) => { delEntrepreneurshipService(item.id).then((res) => {
this.deleteFinish(res) this.deleteFinish(res)
}); });
} else if (this.queryParams.needsType == 4) { } else if (this.queryParams.demandType == 4) {
delTrainService(item.id).then((res) => { delTrainService(item.id).then((res) => {
this.deleteFinish(res) this.deleteFinish(res)
}); });
} else if (this.queryParams.needsType == 5) { } else if (this.queryParams.demandType == 5) {
delOtherService(item.id).then((res) => { delOtherService(item.id).then((res) => {
this.deleteFinish(res) this.deleteFinish(res)
}); });
@@ -302,7 +309,7 @@
}, },
goNeedsDetail(item) { goNeedsDetail(item) {
uni.navigateTo({ uni.navigateTo({
url: `/pages/needs/needDetail?id=${item.id}&type=${this.queryParams.needsType}&showTab=1` url: `/packageRc/pages/needs/needDetail?id=${item.id}&type=${this.queryParams.demandType}&showTab=1`
}) })
}, },
getDictLabel(value, list) { getDictLabel(value, list) {
@@ -317,20 +324,20 @@
}, },
async getCheckData() { async getCheckData() {
let workExperienceYears let workExperienceYears
await this.getDicts('qcjy_gznx').then(res => { await this.$getDict('qcjy_gznx').then(res => {
workExperienceYears = res.data workExperienceYears = res.data
}) })
await this.getDicts('qcjy_xqlc').then(res => { await this.$getDict('qcjy_xqlc').then(res => {
this.currentStatusList = res.data; this.currentStatusList = res.data;
console.log(res.data) console.log(res.data)
}) })
this.checkData = [ this.checkData = [
// { {
// name: "需求类型", name: "需求类型",
// type: "needsType", type: "demandType",
// data: [{dictLabel: '求职需求', dictValue: '1'},{dictLabel: '援助需求', dictValue: '2'},{dictLabel: '创业需求', dictValue: '3'},{dictLabel: '培训需求', dictValue: '4'},{dictLabel: '其他需求', dictValue: '5'}], data: [{dictLabel: '求职需求', dictValue: '1'},{dictLabel: '创业需求', dictValue: '3'},{dictLabel: '培训需求', dictValue: '4'},{dictLabel: '其他需求', dictValue: '5'}],
// activeIndex: 0, activeIndex: 0,
// }, },
{ {
name: "需求状态", name: "需求状态",
type: "currentStatus", type: "currentStatus",
@@ -379,9 +386,9 @@
5: 'other' // 其他需求 5: 'other' // 其他需求
}; };
// 获取当前的需求类型字符串 // 获取当前的需求类型字符串
const demandType = demandTypeMap[this.queryParams.needsType] || 'other'; const demandType = demandTypeMap[this.queryParams.demandType] || 'other';
uni.navigateTo({url: `/packageRc/pages/service/serviceTraceability?id=${item.id}&demandType=${demandType}`});
// 使用映射后的字符串构建URL并导航 // 使用映射后的字符串构建URL并导航
this.$tab.navigateTo(`/pages/services/serviceTraceability?id=${item.id}&demandType=${demandType}`);
}, },
// 触底加载 // 触底加载
getBottomList() { getBottomList() {
@@ -407,27 +414,27 @@
// 获取列表 // 获取列表
async getList() { async getList() {
this.loading = true; this.loading = true;
if (this.queryParams.needsType == 1) { // if (this.queryParams.demandType == 1) {
listJobService(this.queryParams).then((res) => { listJobService(this.queryParams).then((res) => {
this.gettedData(res) this.gettedData(res)
}); });
} else if (this.queryParams.needsType == 2) { // } else if (this.queryParams.demandType == 2) {
listAssistService(this.queryParams).then((res) => { // listAssistService(this.queryParams).then((res) => {
this.gettedData(res) // this.gettedData(res)
}); // });
} else if (this.queryParams.needsType == 3) { // } else if (this.queryParams.demandType == 3) {
listEntrepreneurshipService(this.queryParams).then((res) => { // listEntrepreneurshipService(this.queryParams).then((res) => {
this.gettedData(res) // this.gettedData(res)
}); // });
} else if (this.queryParams.needsType == 4) { // } else if (this.queryParams.demandType == 4) {
listTrainService(this.queryParams).then((res) => { // listTrainService(this.queryParams).then((res) => {
this.gettedData(res) // this.gettedData(res)
}); // });
} else if (this.queryParams.needsType == 5) { // } else if (this.queryParams.demandType == 5) {
listOtherService(this.queryParams).then((res) => { // listOtherService(this.queryParams).then((res) => {
this.gettedData(res) // this.gettedData(res)
}); // });
} // }
}, },
gettedData(res) { gettedData(res) {
if (res.code == 200) { if (res.code == 200) {
@@ -448,11 +455,19 @@
// 需求办结 // 需求办结
requirementHandling(item) { requirementHandling(item) {
this.openDeal = true; // this.$refs.openDeal.open()
this.formData = { // this.formData = {
// id: item.id,
// currentStatus: '3'
// }
console.log(item, 'asdfjoiasiodfjoi')
this.$refs.dealDone.init({
id: item.id, id: item.id,
currentStatus: '3' currentStatus: "3",
} userId: item.userId,
// personStatus: item.personStatus || (this.dict.personStatusList[0] && this.dict.personStatusList[0].dictValue),
});
}, },
// 需求推荐 // 需求推荐
@@ -464,6 +479,7 @@
// 办结按钮 // 办结按钮
async finishJobRecommend() { async finishJobRecommend() {
uni.showLoading();
try { try {
// 检查必填项 // 检查必填项
if (!this.formData.actualSolveDate) { if (!this.formData.actualSolveDate) {
@@ -472,9 +488,7 @@
if (!this.formData.solveDesc) { if (!this.formData.solveDesc) {
throw new Error('解决说明不能为空'); throw new Error('解决说明不能为空');
} }
// 显示全局加载 // 根据 queryParams.demandType 获取对应的 URL
this.$showLoading();
// 根据 queryParams.needsType 获取对应的 URL
const obj = { const obj = {
1: '/demand/personJobDemandInfo/JdJobDemandDone', 1: '/demand/personJobDemandInfo/JdJobDemandDone',
2: '/demand/personAssistDemandInfo/assistDone', 2: '/demand/personAssistDemandInfo/assistDone',
@@ -483,7 +497,7 @@
5: '/demand/personOtherDemandInfo/otherDemandDone', 5: '/demand/personOtherDemandInfo/otherDemandDone',
}; };
const url = obj[this.queryParams.needsType]; const url = '/manage/personDemand/demandDone';//obj[this.queryParams.demandType];
if (!url) { if (!url) {
throw new Error('无效的需求类型'); throw new Error('无效的需求类型');
} }
@@ -495,17 +509,17 @@
// 检查响应码是否为200 // 检查响应码是否为200
if (code === 200) { if (code === 200) {
// 显示成功的提示信息 // 显示成功的提示信息
this.$u.toast(msg); uni.showToast({title: msg, icon: 'none'});
this.openDeal = false; // this.openDeal = false;
this.$refs.openDeal.close()
this.search(); this.search();
} }
} catch (error) { } catch (error) {
// 处理错误并显示提示信息 // 处理错误并显示提示信息
this.$u.toast('请检查必填项填写'); uni.showToast({title: '请检查必填项填写', icon: 'none'});
console.error('完成需求时发生错误:', error);
} finally { } finally {
// 确保加载页总是会被隐藏 // 确保加载页总是会被隐藏
this.$hideLoading(); uni.hideLoading();
} }
}, },
// async finishJobRecommend() { // async finishJobRecommend() {
@@ -517,21 +531,22 @@
// 4: '/demand/personTrainDemandInfo/JdTrainDemandDone', // 4: '/demand/personTrainDemandInfo/JdTrainDemandDone',
// 5: '/demand/personOtherDemandInfo/otherDemandDone', // 5: '/demand/personOtherDemandInfo/otherDemandDone',
// } // }
// if (!this.formData.actualSolveDate) return this.$u.toast('解决时间不能为空'); // if (!this.formData.actualSolveDate) return uni.showToast({title: '解决时间不能为空', icon: 'none'});
// if (!this.formData.solveDesc) return this.$u.toast('解决说明不能为空'); // if (!this.formData.solveDesc) return uni.showToast({title: '解决说明不能为空', icon: 'none'});
// const { // const {
// code, // code,
// data, // data,
// msg // msg
// } = await requirementCompletion(obj[this.queryParams.needsType], this.formData) // } = await requirementCompletion(obj[this.queryParams.demandType], this.formData)
// if (code == 200) { // if (code == 200) {
// this.$u.toast(msg) // uni.showToast({title: ms, icon: 'none'}g)
// this.openDeal = false // this.openDeal = false
// this.search() // this.search()
// } // }
// }, // },
changeFile(e) { changeFile(e) {
console.log(e, 34234234234234)
// 清空当前的 fileUrl 数组 // 清空当前的 fileUrl 数组
this.formData.fileUrl = []; this.formData.fileUrl = [];
// 如果 e 有长度(即用户选择了文件) // 如果 e 有长度(即用户选择了文件)
@@ -542,7 +557,7 @@
this.formData.fileUrl.push(url); this.formData.fileUrl.push(url);
} }
} }
this.formData.fileUrl = this.$arrayToString(this.formData.fileUrl) this.formData.fileUrl = this.formData.fileUrl.join(',');
}, },
} }
} }
@@ -550,9 +565,8 @@
<style lang="scss" scoped> <style lang="scss" scoped>
.page { .page {
background-color: #EEF1F5 !important; background-color: #f4f4f4 !important;
height: 100vh; height: 100vh;
background-image: url('https://rc.jinan.gov.cn/qcwjyH5/static/images/top.png');
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: 100% auto; background-size: 100% auto;
} }
@@ -573,11 +587,15 @@
.search-icon { .search-icon {
width: 40rpx; width: 40rpx;
height: 40rpx;
} }
} }
.job-item { .job-item {
position: relative; position: relative;
margin-bottom: 24rpx;
background: #fff;
border-radius: 16rpx;
.item_btn{ .item_btn{
height: 100rpx; height: 100rpx;
border-top: 1px solid #e3e8ee; border-top: 1px solid #e3e8ee;
@@ -620,8 +638,6 @@
} }
.top-container { .top-container {
background: #fff;
border-radius: 16rpx;
padding: 32rpx; padding: 32rpx;
// margin-bottom: 24rpx; // margin-bottom: 24rpx;
@@ -778,4 +794,54 @@
width: 100%; width: 100%;
} }
} }
.df_flex{
display: flex;
view{
flex-grow: 1;
text-align: center;
color: #4c6efb;
}
}
.df_flex_1{
flex: 1;
}
.df__direction_column {
flex-direction: column;
}
.df_align_center{
align-items: center;
}
.df_justify_center{
justify-content: center;
}
.df_content_between{
justify-content: space-between;
}
.df_shrink_0{
flex-shrink: 0;
}
/* 日期选择器样式 */
.date-picker-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
box-sizing: border-box;
padding: 0 24rpx;
height: 64rpx;
border: 1px solid #ddd;
border-radius: 4px;
background-color: #fff;
}
// .date-picker-wrapper.noValue {
// background-color: #f9f9f9;
// }
.date-value {
color: #333;
width: 100%
}
</style> </style>

View File

@@ -69,7 +69,6 @@
import { import {
getPersonBase getPersonBase
} from "@/apiRc/person"; } from "@/apiRc/person";
import PopupList from "../../components/PopupLists.vue";
import { import {
listJobService, listJobService,
delJobService delJobService
@@ -96,7 +95,6 @@ import { listJobType } from "@/apiRc/jobType/index";
} from '@/apiRc/needs/otherService' } from '@/apiRc/needs/otherService'
export default { export default {
components: { components: {
PopupList,
}, },
onShow() { onShow() {
console.log('search',34224234) console.log('search',34224234)

View File

@@ -41,9 +41,9 @@
</view> </view>
</view> </view>
<view <view
style="position: relative; padding-top: 16px; color: #000;display: flex;align-items: center;justify-content: space-between;"> style="position: relative; color: #000;display: flex;align-items: center;justify-content: space-between;">
<view v-if="total"> <view v-if="total">
<text style="color:font-size:12rpx;margin-left:10rpx;">{{ total }}条信息</text> <text style="margin-left:10rpx;">{{ total }}条信息</text>
</view> </view>
<view style="display: flex;width: 200rpx" class="sort-type"> <view style="display: flex;width: 200rpx" class="sort-type">
<!-- <view class="sort-type" @click="showSortPicker=true">{{ sortType ? sortType : '排序方式' }}</view> --> <!-- <view class="sort-type" @click="showSortPicker=true">{{ sortType ? sortType : '排序方式' }}</view> -->
@@ -143,7 +143,7 @@
<!-- <view class="post_job_btn" @tap.stop="$tab.navigateTo('/pages/community/personEdit?type=add')"> <!-- <view class="post_job_btn" @tap.stop="$tab.navigateTo('/pages/community/personEdit?type=add')">
</view> --> </view> -->
<uni-popup :show="show" ref="show" @close="close" @open="open"> <uni-popup :show="show" ref="show" @close="close" @open="open" type="bottom" background-color="#fff">
<view class="dialog_div"> <view class="dialog_div">
<view class="dialog_div_top"> <view class="dialog_div_top">
<view @click="close">取消</view> <view @click="close">取消</view>
@@ -258,7 +258,7 @@
</uni-popup> </uni-popup>
<!-- 社区端 - 显示隐藏退出组件 --> <!-- 社区端 - 显示隐藏退出组件 -->
<exitPopup /> <!-- <exitPopup /> -->
</view> </view>
</template> </template>
@@ -276,11 +276,9 @@ import exitPopup from "../../components/exitPopup.vue";
import { import {
getDicts getDicts
} from '@/apiRc/system/dict.js' } from '@/apiRc/system/dict.js'
import PopupList from "../../components/PopupLists.vue";
export default { export default {
name: "personnelList", name: "personnelList",
components: { components: {
PopupList,
exitPopup, exitPopup,
}, },
data() { data() {

View File

@@ -0,0 +1,285 @@
<template>
<view class="job-list" style="background-image: url('../../../packageRc/static/pageBg.png');position:relative;">
<view class="job-list__content">
<scroll-view class="job-list__scroll" scroll-y="true">
<view class="job-list__item" v-for="job in perlist" :key="job.id" @tap="toDetails(job)">
<view class="job-list__item-detail">
<text>经办人:</text>
<text>{{ job.agentUserName || '-' }}</text>
</view>
<view class="job-list__item-detail">
<text>经办时间:</text>
<text>{{ job.practicalSolutionTime }}</text>
</view>
<view class="job-list__item-detail">
<text>经办部门:</text>
<text>{{ job.agentDeptName }}</text>
</view>
<view class="job-list__item-detail">
<text>说明:</text>
<text>{{ job.blqksm || '--'}}</text>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
import {
serviceTraceability
} from '@/apiRc/company/index.js';
export default {
name: 'personnelList',
computed: {
filterColor() {
return (status) => {
const item = this.alertTibs.find(item => item.value === status);
return item ? item.color : '';
}
}
},
data() {
return {
openDeal: false,
showTime: false,
validType: [{
label: '是',
value: '1'
},
{
label: '否',
value: '0'
},
],
alertTibs: [{
value: '1',
label: '已超期',
color: '#ea362b'
},
{
value: '2',
label: '七天之内',
color: '#f1a945'
},
{
value: '3',
label: '大于七天',
color: '#377e27'
},
{
value: '0',
label: '已完成服务',
color: '#808080'
}
],
total: 0,
// 去除加载更多相关的状态和方法
// status: 'more',
// loadMoreJobs: function() {},
hopeSolveDate: '',
searchKeyword: '',
queryParams: {
pageNum: 1,
pageSize: 10,
id: undefined,
demandType: '',
},
perlist: [],
loading: false,
formData: {},
};
},
onLoad({
id,
demandType
}) {
this.queryParams.id = id
this.queryParams.demandType = demandType
this.getList(true);
},
methods: {
// 获取列表
async getList(reset = false) {
if (this.loading) return;
this.loading = true;
// 重置数据
if (reset) {
this.perlist = [];
this.queryParams.pageNum = 1;
}
const {
code,
data,
total
} = await serviceTraceability(this.queryParams)
if (code === 200) {
this.perlist = data; // 直接赋值获取到的数据,不再进行拼接
this.total = total;
}
this.loading = false;
},
// 搜索功能处理
handleSearch() {
this.getList(true);
},
// 根据 value 查找 label
getLabelByValue(list, value) {
const found = list.find(item => item.value === value);
return found ? found.label : '-';
},
getDictLabel(list, dictValue) {
let arr = list.filter((ele) => ele.dictValue == dictValue);
if (arr.length) {
return arr[0].dictLabel;
} else {
return "--";
}
},
toDetails({
businessType,
id
}) {
// 定义一个映射对象,将 businessType 映射到相应的页面路径和参数
const navigationMap = {
interview: {
path: '/pages/services/serviceDetail',
params: `?id=${id}&type=1&showTab=1`
},
assist: {
path: '/pages/needs/needDetail',
params: `?id=${id}&type=2&showTab=1`
},
entrepreneurship: {
path: '/pages/needs/needDetail',
params: `?id=${id}&type=3&showTab=1`
},
jobDemand: {
path: '/pages/needs/needDetail',
params: `?id=${id}&type=1&showTab=1&showInfo=1`
},
jobRecommendation: {
path: '/pages/services/serviceDetail',
params: `?id=${id}&type=3&showTab=1&showInfo=1`
},
otherNeeds: {
path: '/pages/needs/needDetail',
params: `?id=${id}&type=5&showTab=1`
},
policy: {
path: '/pages/services/serviceDetail',
params: `?id=${id}&type=2&showTab=1`
},
trainingNeeds: {
path: '/pages/needs/needDetail',
params: `?id=${id}&type=4&showTab=1`
},
trainingService: {
path: '/pages/needs/needDetail',
params: `?id=${id}&type=4&showTab=1`
}
};
// // 检查 businessType 是否存在于映射中
// if (businessType in navigationMap) {
// const {
// path,
// params
// } = navigationMap[businessType];
// this.$tab.navigateTo(`${path}${params}`);
// } else {
// // 如果 businessType 不匹配任何已知的类型,可以这里处理错误或忽略
// console.warn(`Unknown businessType: ${businessType}`);
// }
}
},
};
</script>
<style lang="scss" scoped>
.job-list {
background-color: #f4f4f4 !important;
height: 100vh;
background-repeat: no-repeat;
background-size: 100% auto;
padding: 32rpx;
&__content {
position: relative;
padding: 32rpx;
z-index: 10;
background-color: #fff;
border-radius: 32rpx 32rpx 0 0;
border: 1px solid #fff;
width: calc(100% - 64rpx);
}
&__scroll {
margin-top: 10rpx;
height: calc(100vh - 200rpx);
}
&__item {
position: relative;
padding: 32rpx;
margin-bottom: 32rpx;
background-color: #d0dcee;
border-radius: 16rpx;
font-size: 28rpx;
}
&__item-detail {
margin-top: 20rpx;
color: #8e8e8e;
&>text:nth-child(1) {
width: 200rpx;
}
view,
text:last-child {
margin-left: 10rpx;
color: #333;
}
}
.items {
margin-top: 30rpx;
}
.post_job_btn {
position: fixed;
bottom: 120rpx;
right: 16rpx;
width: 150rpx;
height: 150rpx;
border-radius: 50%;
z-index: 20;
background: url('https://rc.jinan.gov.cn/qcwjyH5/static/images/addPersonnel.png') no-repeat;
background-size: 100% 100%;
}
.dialog_form {
padding: 30rpx;
width: 80vw;
.tadio {
height: 100rpx;
}
.btn {
margin-top: 100rpx;
}
}
}
</style>

View File

@@ -359,10 +359,17 @@
{ {
"path": "train/mockExam/examList", "path": "train/mockExam/examList",
"style": { "style": {
"navigationBarTitleText": "模拟考试", "navigationBarTitleText": "考试列表",
"navigationBarTitleTextSize": "30rpx" "navigationBarTitleTextSize": "30rpx"
} }
}, },
{
"path": "train/mockExam/startExam",
"style": {
"navigationBarTitleText": "模拟考试",
"navigationBarTitleTextSize": "30rpx"
}
},
{ {
"path": "train/mockExam/viewGrades", "path": "train/mockExam/viewGrades",
"style": { "style": {
@@ -398,7 +405,13 @@
{ {
"path": "pages/personalList/personalList", "path": "pages/personalList/personalList",
"style": { "style": {
"navigationBarTitleText": "添加帮扶" "navigationBarTitleText": "毕业生追踪"
}
},
{
"path": "pages/jobList/jobList",
"style": {
"navigationBarTitleText": "岗位列表"
} }
}, },
{ {
@@ -428,10 +441,15 @@
"style": { "style": {
"navigationBarTitleText": "服务" "navigationBarTitleText": "服务"
} }
} , {
"path": "pages/service/serviceTraceability",
"style": {
"navigationBarTitleText": "服务追溯"
}
} , { } , {
"path": "pages/needs/needDetail", "path": "pages/needs/needDetail",
"style": { "style": {
"navigationBarTitleText": "需求" "navigationBarTitleText": "需求信息"
} }
} , { } , {
"path": "pages/daiban/bangfuList", "path": "pages/daiban/bangfuList",
@@ -443,6 +461,11 @@
"style": { "style": {
"navigationBarTitleText": "需求上报" "navigationBarTitleText": "需求上报"
} }
} , {
"path": "pages/needs/needsList",
"style": {
"navigationBarTitleText": "需求"
}
} }
] ]
}, },

View File

@@ -1047,14 +1047,14 @@ import { getToken } from '@/utilsRc/auth.js';
// 跳转到高校毕业页面 // 跳转到高校毕业页面
function goRc(){ function goRc(){
if (checkLogin()) { if (checkLogin()) {
navTo('/packageRc/pages/index/index');
let token = getToken(); let token = getToken();
if( token != null ){ if( token != null && token != '' && token != undefined ){
if(storeRc.state.user.type == 'person'){ if(storeRc.state.user.type == 'person'){
navTo('/packageRc/pages/index/index'); navTo('/packageRc/pages/index/index');
}else{ }else{
navTo('/packageRc/pages/daiban/daiban'); navTo('/packageRc/pages/daiban/daiban');
} }
console.log(storeRc.state.user.roles, storeRc.state.user.type, 'state')
}else{ }else{
let userInfo = uni.getStorageSync('userInfo') let userInfo = uni.getStorageSync('userInfo')
storeRc.dispatch('LoginByUserInfo', userInfo).then(res => { storeRc.dispatch('LoginByUserInfo', userInfo).then(res => {

View File

@@ -1,8 +1,7 @@
{ {
"description": "项目配置文件。", "description": "项目配置文件。",
"packOptions": { "packOptions": {
"ignore": [], "ignore": []
"include": []
}, },
"setting": { "setting": {
"urlCheck": false, "urlCheck": false,
@@ -10,21 +9,28 @@
"postcss": true, "postcss": true,
"minified": true, "minified": true,
"newFeature": true, "newFeature": true,
"bigPackageSizeSupport": true, "bigPackageSizeSupport": true
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"condition": false
}, },
"compileType": "miniprogram", "compileType": "miniprogram",
"libVersion": "3.10.3", "libVersion": "3.5.7",
"appid": "wx9d1cbc11c8c40ba7", "appid": "wx9d1cbc11c8c40ba7",
"projectname": "qingdao-employment-service", "projectname": "qingdao-employment-service",
"condition": {}, "condition": {
"editorSetting": { "search": {
"tabIndent": "insertSpaces", "current": -1,
"tabSize": 2 "list": []
},
"conversation": {
"current": -1,
"list": []
},
"game": {
"current": -1,
"list": []
},
"miniprogram": {
"current": -1,
"list": []
}
} }
} }

View File

@@ -20,7 +20,7 @@ const request = config => {
if (getToken() && !isToken) { if (getToken() && !isToken) {
config.header['Authorization'] = 'Bearer ' + getToken() config.header['Authorization'] = 'Bearer ' + getToken()
} }
config.header['Authorization'] = 'Bearer ' + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJQSlUyVlJCc1E1aXRMMWgxdjNkcVh2eER1c2VVc0hvRiIsInVzZXJJZCI6MX0.z4Z2XqgXyU0GQU-i7Bsa5T-zCKApTxj1YQ73rk7bAVo' config.header['Authorization'] = 'Bearer ' + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiJGUVl3YmRUalAzQ1BMNGFVc0RxeGJmdjAyT3JMZllDVSIsInVzZXJJZCI6MX0.kSOXY2QJQPbfjE0Yx2R3S8yQciA33OZBS9xJtr7cQ1A'
// get请求映射params参数 // get请求映射params参数
if (config.params) { if (config.params) {
let url = config.url + '?' + tansParams(config.params) let url = config.url + '?' + tansParams(config.params)