增加H5端车辆需求计划申请

This commit is contained in:
BianLzhaoMin 2026-02-05 16:26:54 +08:00
parent e2d4a98659
commit 25a1849306
11 changed files with 3277 additions and 0 deletions

View File

@ -0,0 +1,816 @@
/* H5移动端样式 - 车辆需求计划申请 */
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: 0;
background: #f5f5f5;
font-family: 'Alibaba PuHuiTi R', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
-webkit-font-smoothing: antialiased;
}
/* 顶部标题栏 */
.h5-header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 44px;
background: #409EFF;
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.header-content {
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 16px;
font-weight: 500;
}
.header-content .layui-icon {
font-size: 18px;
margin-right: 8px;
}
.header-title {
font-size: 16px;
}
/* 主容器 */
.h5-container {
margin-top: 44px;
padding: 12px;
padding-bottom: 70px; /* 为底部固定按钮留出空间 */
}
/* 表单卡片 */
.form-card {
background: #fff;
border-radius: 8px;
margin-bottom: 12px;
padding: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
/* 卡片头部 */
.card-header {
display: flex;
align-items: center;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 1px solid #f0f0f0;
position: relative;
}
.card-header .layui-icon {
font-size: 18px;
color: #409EFF;
margin-right: 8px;
}
.card-title {
font-size: 16px;
font-weight: 600;
color: #333;
flex: 1;
}
.return-btn {
position: absolute;
right: 0;
background: #f5f5f5;
border: none;
border-radius: 4px;
padding: 6px 12px;
display: flex;
align-items: center;
cursor: pointer;
font-size: 14px;
color: #666;
}
.return-btn .layui-icon {
margin-right: 4px;
font-size: 14px;
color: #666;
}
.return-btn:active {
background: #e8e8e8;
}
/* 表单样式 */
.layui-form-item {
margin-bottom: 16px;
}
.layui-form-label {
width: 100px !important;
padding: 9px 0;
font-size: 14px;
color: #333;
text-align: left;
}
.layui-form-label.required::after {
content: '*';
color: red;
margin-left: 4px;
}
.layui-input-block {
margin-left: 100px !important;
}
.layui-input,
.layui-select,
.layui-textarea {
font-size: 14px;
border-radius: 4px;
border: 1px solid #e0e0e0;
}
.layui-input:focus,
.layui-select:focus,
.layui-textarea:focus {
border-color: #409EFF;
}
.layui-textarea {
min-height: 100px;
resize: none;
}
/* 字符计数 */
.char-count {
text-align: right;
font-size: 12px;
color: #999;
margin-top: 4px;
}
/* 单位输入框 */
.input-with-unit {
display: flex;
align-items: center;
}
.input-with-unit .layui-input {
flex: 1;
}
.input-with-unit .unit {
margin-left: 8px;
font-size: 14px;
color: #666;
}
/* 单选框组 */
.layui-form-radio {
margin-right: 20px;
margin-top: 0;
}
.layui-form-radio > i {
font-size: 18px;
}
.layui-form-radioed > i {
color: #409EFF;
}
/* 途经点提示 */
.route-point-tip {
margin-top: -8px;
margin-bottom: 16px;
padding-left: 100px;
font-size: 12px;
color: #999;
}
.add-route-btn {
display: inline-flex;
align-items: center;
color: #409EFF;
cursor: pointer;
margin-left: 8px;
font-size: 14px;
}
.add-route-btn .layui-icon {
margin-right: 4px;
font-size: 14px;
}
.add-route-btn:active {
opacity: 0.7;
}
/* 上传区域 */
.upload-area {
display: flex;
flex-wrap: wrap;
/* gap: 12px; */
margin-bottom: 8px;
position: relative;
}
/* 上传按钮包装器 */
.upload-btn-wrapper {
position: relative;
width: 80px;
height: 80px;
}
/* 原生文件输入框 */
#fileInput {
position: absolute !important;
width: 80px !important;
height: 80px !important;
top: 0 !important;
left: 0 !important;
opacity: 0 !important;
cursor: pointer !important;
z-index: 999 !important;
margin: 0 !important;
padding: 0 !important;
font-size: 0 !important;
pointer-events: auto !important;
/* 确保input可以正常交互 */
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
.upload-btn {
width: 80px;
height: 80px;
background-color: #f5f5f5;
border: 1px dashed #d9d9d9;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
position: relative;
z-index: 1;
pointer-events: auto; /* 允许点击然后手动触发input */
}
.layui-upload-list {
/* margin: 0; */
margin-right: 10px;
}
/* 确保没有其他元素覆盖 */
.upload-area {
position: relative;
z-index: 1;
}
.upload-btn-wrapper {
position: relative;
z-index: 2;
margin-top: 11px;
}
.upload-btn .layui-icon {
font-size: 32px;
color: #999;
}
.upload-btn:active {
background-color: #e8e8e8;
}
.uploader-list {
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: flex-start; /* 确保顶部对齐 */
}
.uploader-list .file-iteme {
position: relative;
width: 80px;
height: 80px;
flex-shrink: 0; /* 防止压缩 */
}
/* 图片预览样式 */
.uploader-list .file-iteme .file-preview-img {
width: 80px;
height: 80px;
object-fit: cover;
border-radius: 4px;
display: block;
}
/* 非图片文件盒子样式 */
.uploader-list .file-iteme .file-preview-box {
width: 80px;
height: 80px;
background: #f5f5f5;
border: 1px solid #e0e0e0;
border-radius: 4px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 4px;
box-sizing: border-box;
}
.uploader-list .file-iteme .file-preview-box .file-icon {
width: 40px;
height: 40px;
object-fit: contain;
margin-bottom: 4px;
}
.uploader-list .file-iteme .file-preview-box .file-name {
font-size: 10px;
color: #666;
text-align: center;
margin: 0;
line-height: 1.2;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
max-height: 24px;
}
.uploader-list .handle {
position: absolute;
top: -8px;
right: -8px;
width: 20px;
height: 20px;
background-color: #ff4d4f;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
z-index: 10;
}
.uploader-list .handle p {
color: #fff;
font-size: 14px;
margin: 0;
line-height: 1;
}
/* 保留旧的upload-file样式以兼容如果其他地方用到 */
.upload-file {
width: 80px;
height: 80px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: #f5f5f5;
border-radius: 4px;
}
.upload-file img {
width: 40px;
height: 40px;
object-fit: contain;
}
.upload-file p {
font-size: 10px;
color: #666;
margin-top: 4px;
text-align: center;
word-break: break-all;
padding: 0 4px;
}
.upload-tip {
/* padding-left: 100px; */
margin-top: 8px;
}
.upload-tip p {
font-size: 12px;
color: #ff4d4f;
margin: 0;
}
/* 无数据状态 */
.no-data-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 20px;
min-height: 200px;
}
.no-data-container img {
width: 120px;
height: 120px;
opacity: 0.5;
margin-bottom: 16px;
}
.no-data-text {
font-size: 16px;
font-weight: 600;
color: #333;
margin: 8px 0;
}
.no-data-tip {
font-size: 14px;
color: #999;
margin: 8px 0 20px;
text-align: center;
}
.no-data-container .layui-btn {
display: flex;
align-items: center;
padding: 8px 20px;
}
.no-data-container .layui-btn .layui-icon {
margin-right: 4px;
}
/* 有数据时-展示 */
.has-data-container {
padding: 20px;
background: #f0f7ff;
border-radius: 8px;
border: 1px solid #d0e7ff;
}
.selected-info {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
margin-bottom: 16px;
padding: 12px;
background: #fff;
border-radius: 6px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
.selected-count-text {
font-size: 15px;
color: #333;
font-weight: 500;
}
.selected-count-text span {
color: #409EFF;
font-weight: 600;
font-size: 16px;
}
.has-data-container .layui-btn {
width: 100%;
}
/* 选择类型页面样式 */
.select-type-page {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #f5f5f5;
z-index: 1000;
overflow-y: auto;
}
.select-type-page .h5-container {
padding-bottom: 70px; /* 为底部按钮留出空间 */
}
/* 选择类型页面头部优化 */
.select-type-page .h5-header {
padding: 0 8px; /* 减小左右内边距,给右侧更多空间 */
}
.select-type-page .header-left {
flex: 0 1 auto; /* 允许缩小,但不扩展 */
max-width: 50%; /* 限制左侧最大宽度 */
}
.select-type-page .header-right {
width: 40%;
gap: 6px; /* 减小间距 */
margin-left: 8px; /* 增加与左侧的间距 */
}
.select-type-page .selected-count {
font-size: 12px; /* 稍微减小字体 */
}
.select-type-page .return-btn {
margin-right: 20px;
padding: 4px 6px; /* 减小按钮内边距 */
font-size: 11px; /* 稍微减小字体 */
}
.select-type-page .return-btn span {
display: none; /* 在小屏幕上隐藏文字,只显示图标 */
}
/* 在较大屏幕上显示返回按钮文字 */
@media screen and (min-width: 375px) {
.select-type-page .return-btn span {
display: inline;
}
.select-type-page .header-right {
gap: 8px;
}
}
/* 固定在底部的提交按钮 */
.fixed-submit-btn {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: #fff;
padding: 12px;
box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
z-index: 999;
}
.submit-btn-full {
width: 100%;
height: 44px;
font-size: 16px;
border-radius: 4px;
}
/* 为底部按钮留出空间 */
.h5-container {
padding-bottom: 70px;
}
/* 底部按钮 */
.btn-box {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 12px;
background: #fff;
border-top: 1px solid #e0e0e0;
display: flex;
gap: 12px;
z-index: 999;
box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.05);
}
.btn-box .layui-btn {
flex: 1;
height: 44px;
line-height: 44px;
font-size: 16px;
border-radius: 4px;
}
.btn-box .layui-btn.layui-btn-disabled {
opacity: 0.6;
}
/* 添加的途径点 */
.addTjd {
margin-bottom: 12px;
/* position: relative; */
}
.addTjdInput {
width: 85%;
}
.addTjd .layui-form-label {
/* width: 100px !important; */
}
.addTjd .layui-input-block {
/* margin-left: 100px !important; */
/* padding-right: 30px; */
}
.addTjd img {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
width: 24px;
height: 24px;
cursor: pointer;
}
/* 响应式调整 */
@media screen and (max-width: 375px) {
.layui-form-label {
width: 90px !important;
}
.layui-input-block {
margin-left: 90px !important;
}
.route-point-tip,
.upload-tip {
/* padding-left: 90px; */
}
}
/* layout布局类 */
.layout {
display: flex;
align-items: center;
justify-content: center;
}
/* 修复layui样式冲突 */
.layui-form-radio {
line-height: 28px;
}
.layui-form-radio > * {
font-size: 14px;
}
.layui-form-select dl dd {
font-size: 14px;
}
/* 优化下拉选择框样式 - 工程选择 */
.layui-form-select {
width: 100%;
}
.layui-form-select .layui-select-title {
width: 100%;
}
.layui-form-select .layui-select-title input {
width: 100%;
padding-right: 30px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 下拉选项列表容器 */
.layui-form-select dl {
position: absolute !important;
top: 100% !important;
left: 0 !important;
margin-top: 2px !important;
border: 1px solid #e0e0e0;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
background: #fff;
z-index: 9999;
max-height: 50vh;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
/* 下拉选项项 - 不强制display让layui自己控制过滤 */
.layui-form-select dl dd {
width: 100% !important;
padding: 10px 12px !important;
white-space: normal !important;
word-wrap: break-word !important;
word-break: break-all !important;
line-height: 1.6 !important;
min-height: auto !important;
height: auto !important;
overflow: visible !important;
text-overflow: clip !important;
box-sizing: border-box !important;
}
/* 确保layui搜索过滤功能正常 - layui会自动添加layui-disabled类来隐藏被过滤的选项 */
.layui-form-select dl dd.layui-disabled {
display: none !important;
}
/* 选项文本内容 - 允许换行 */
.layui-form-select dl dd,
.layui-form-select dl dd a {
white-space: normal !important;
word-wrap: break-word !important;
word-break: break-all !important;
overflow-wrap: break-word !important;
width: 100% !important;
}
/* 下拉选项悬停和选中状态 */
.layui-form-select dl dd:hover,
.layui-form-select dl dd.layui-this {
background-color: #f0f7ff;
color: #409EFF;
}
/* 搜索输入框样式 - layui的搜索输入框 */
.layui-form-select dl input[type="text"],
.layui-form-select dl input.layui-input {
width: 100% !important;
padding: 8px 12px !important;
border: none !important;
border-bottom: 1px solid #e0e0e0 !important;
border-radius: 0 !important;
font-size: 14px !important;
box-sizing: border-box !important;
background: #fff !important;
}
/* 确保搜索输入框可见且可交互 */
.layui-form-select dl input[type="text"]:focus,
.layui-form-select dl input.layui-input:focus {
outline: none !important;
border-bottom-color: #409EFF !important;
}
/* 确保下拉列表在移动端正确显示 */
.layui-form-select .layui-edge {
right: 10px;
top: 50%;
}
/* 移动端下拉列表优化 */
@media screen and (max-width: 768px) {
.layui-form-select dl {
max-height: 50vh;
}
.layui-form-select dl dd {
padding: 12px 16px !important;
font-size: 15px !important;
}
}
/* 移动端优化 */
@media screen and (max-width: 320px) {
.layui-form-label {
width: 80px !important;
font-size: 13px;
}
.layui-input-block {
margin-left: 80px !important;
}
.route-point-tip,
.upload-tip {
padding-left: 80px;
}
}
/* 确保按钮在移动端可点击 */
.layui-btn {
-webkit-tap-highlight-color: transparent;
touch-action: manipulation;
}
/* 输入框在移动端优化 */
input, textarea, select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
/* 防止iOS输入框缩放 */
@media screen and (max-width: 768px) {
input[type="text"],
input[type="number"],
textarea,
select {
font-size: 16px !important;
}
}

View File

@ -0,0 +1,602 @@
/* H5移动端样式 - 选择类型页面 */
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: 0;
background: #f5f5f5;
font-family: 'Alibaba PuHuiTi R', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
-webkit-font-smoothing: antialiased;
padding-bottom: 70px;
}
/* 顶部标题栏 */
.h5-header {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 44px;
background: #409EFF;
z-index: 1000;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
min-width: 0; /* 允许flex容器缩小 */
}
.header-left {
display: flex;
align-items: center;
color: #fff;
font-size: 16px;
font-weight: 500;
flex: 1;
min-width: 0; /* 允许缩小 */
overflow: hidden; /* 防止内容溢出 */
}
.header-left .layui-icon {
font-size: 18px;
margin-right: 8px;
flex-shrink: 0; /* 图标不缩小 */
}
.header-left .header-title {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.header-right {
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
min-width: 0; /* 允许flex子项缩小 */
}
.selected-count {
color: #fff;
font-size: 13px;
white-space: nowrap; /* 防止换行 */
flex-shrink: 0;
}
.return-btn {
background: rgba(255, 255, 255, 0.2);
border: none;
border-radius: 4px;
padding: 4px 8px;
display: flex;
align-items: center;
cursor: pointer;
font-size: 12px;
color: #fff;
white-space: nowrap; /* 防止文字换行 */
flex-shrink: 0; /* 防止按钮被压缩 */
}
.return-btn .layui-icon {
margin-right: 4px;
font-size: 12px;
flex-shrink: 0;
}
.return-btn span {
white-space: nowrap;
}
.return-btn:active {
background: rgba(255, 255, 255, 0.3);
}
/* 主容器 */
.h5-container {
margin-top: 44px;
padding: 12px;
}
/* 页面标题 */
.page-title {
display: flex;
align-items: center;
padding: 12px;
background: #fff;
border-radius: 8px;
margin-bottom: 12px;
font-size: 16px;
font-weight: 600;
color: #333;
}
.page-title .layui-icon {
font-size: 18px;
color: #409EFF;
margin-right: 8px;
}
/* 搜索卡片 */
.search-card {
background: #fff;
border-radius: 8px;
padding: 12px;
margin-bottom: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
}
.search-inputs {
display: flex;
gap: 8px;
margin-bottom: 12px;
}
.search-inputs .layui-input {
width: 100%;
font-size: 14px;
border-radius: 4px;
border: 1px solid #e0e0e0;
}
.search-inputs .layui-input:focus {
border-color: #409EFF;
}
.search-btns {
display: flex;
gap: 8px;
}
.search-btns .layui-btn {
flex: 1;
font-size: 14px;
/* padding: 8px 12px; */
}
/* 列表容器 */
.list-container {
display: flex;
flex-direction: column;
gap: 12px;
}
/* 列表项卡片 */
.list-item {
background: #fff;
border-radius: 8px;
padding: 16px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
position: relative;
}
.list-item.selected {
border: 2px solid #409EFF;
background: #f0f7ff;
}
.list-item.selected .item-header {
border-bottom-color: #d0e7ff;
}
.item-header {
display: flex;
align-items: flex-start;
margin-bottom: 12px;
padding-bottom: 12px;
border-bottom: 1px solid #f0f0f0;
}
.item-checkbox-wrapper {
margin-right: 12px;
margin-top: 2px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
}
.item-checkbox {
width: 20px !important;
height: 20px !important;
cursor: pointer;
margin: 0 !important;
display: block !important;
visibility: visible !important;
opacity: 1 !important;
appearance: checkbox;
-webkit-appearance: checkbox;
-moz-appearance: checkbox;
position: relative;
z-index: 1;
}
.item-content {
flex: 1;
display: flex;
align-items: flex-start;
gap: 12px;
}
.item-number {
width: 28px;
height: 28px;
background: #f0f0f0;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 600;
color: #666;
flex-shrink: 0;
}
.item-basic-info {
flex: 1;
display: flex;
flex-direction: column;
gap: 8px;
}
.info-row {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
line-height: 1.6;
}
.info-row-1 {
display: flex;
align-items: center;
justify-content: space-between !important;
flex-wrap: wrap;
gap: 8px;
line-height: 1.6;
}
.info-row-item-1 {
margin-right: 10px;
}
.info-label {
font-size: 14px;
color: #999;
font-weight: normal;
}
.info-value {
font-size: 14px;
color: #333;
font-weight: 500;
}
.info-value.name-text,
.info-value.spec-text {
flex: 1;
word-wrap: break-word;
word-break: break-all;
}
.type-tag {
display: inline-block;
padding: 2px 8px;
background: #e6f7ff;
color: #409EFF;
border-radius: 4px;
font-size: 13px;
font-weight: 600;
margin-right: 4px;
}
.item-body {
margin-top: 12px;
padding-top: 12px;
}
.form-row {
display: flex;
align-items: center;
margin-bottom: 12px;
}
.form-row:last-child {
margin-bottom: 0;
}
.form-label {
width: 80px;
font-size: 14px;
color: #666;
flex-shrink: 0;
text-align: left;
}
.form-label.required::after {
content: '*';
color: red;
margin-left: 2px;
}
.form-input {
flex: 1;
}
.form-input .layui-input,
.form-input .layui-textarea {
font-size: 14px;
border-radius: 4px;
border: 1px solid #e0e0e0;
}
.form-input .layui-input:focus,
.form-input .layui-textarea:focus {
border-color: #409EFF;
}
.form-input .layui-textarea {
min-height: 60px;
resize: none;
}
/* 分页区域 */
.pagination-box {
display: flex;
align-items: center;
justify-content: center;
gap: 16px;
padding: 16px;
background: #fff;
border-radius: 8px;
margin-top: 12px;
}
.pagination-box .layui-btn {
min-width: 80px;
font-size: 14px;
}
.pagination-box .layui-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.page-info {
font-size: 14px;
color: #666;
min-width: 60px;
text-align: center;
}
/* 底部按钮 */
.btn-box {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 12px;
background: #fff;
border-top: 1px solid #e0e0e0;
display: flex;
gap: 12px;
z-index: 999;
box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.05);
}
.btn-box .layui-btn {
flex: 1;
height: 44px;
line-height: 44px;
font-size: 16px;
border-radius: 4px;
}
/* 空状态 */
.empty-state {
text-align: center;
padding: 60px 20px;
color: #999;
font-size: 14px;
}
.empty-state .layui-icon {
font-size: 48px;
color: #d9d9d9;
margin-bottom: 16px;
}
/* 加载状态 */
.loading-state {
text-align: center;
padding: 40px 20px;
color: #999;
font-size: 14px;
}
/* 响应式调整 */
@media screen and (max-width: 375px) {
.form-label {
width: 70px;
font-size: 13px;
}
}
/* 修复layui样式 */
.layui-btn {
-webkit-tap-highlight-color: transparent;
touch-action: manipulation;
}
input, textarea, select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
/* 防止iOS输入框缩放 */
@media screen and (max-width: 768px) {
input[type="text"],
input[type="number"],
textarea,
select {
font-size: 16px !important;
}
}
/* 确认弹框样式 */
.confirm-dialog-content {
padding: 0;
}
.confirm-title {
display: flex;
align-items: center;
padding: 16px;
border-bottom: 1px solid #f0f0f0;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #fff;
border-radius: 4px 4px 0 0;
}
.confirm-title i {
color: #fff !important;
}
.confirm-title span {
color: #fff !important;
}
.confirm-tip {
padding: 12px 16px;
background: #fff3e0;
border-left: 3px solid #ff9800;
margin: 0 16px 16px 16px;
border-radius: 4px;
display: flex;
align-items: center;
gap: 8px;
}
.confirm-tip i {
color: #ff9800;
font-size: 16px;
}
.confirm-list {
max-height: 400px;
overflow-y: auto;
}
.confirm-list-header {
padding: 12px 16px;
background: #f5f7fa;
font-weight: 600;
color: #333;
font-size: 14px;
border-bottom: 1px solid #e0e0e0;
}
.confirm-list-body {
padding: 8px;
}
.confirm-item {
display: flex;
align-items: flex-start;
padding: 12px;
margin-bottom: 8px;
background: #fff;
border: 1px solid #e0e0e0;
border-radius: 6px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
transition: all 0.3s;
}
.confirm-item:hover {
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
border-color: #409EFF;
}
.confirm-item-number {
width: 28px;
height: 28px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #fff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 600;
flex-shrink: 0;
margin-right: 12px;
}
.confirm-item-content {
flex: 1;
display: flex;
flex-direction: column;
gap: 6px;
}
.confirm-item-row {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
line-height: 1.6;
font-size: 13px;
}
.confirm-label {
color: #999;
font-weight: normal;
flex-shrink: 0;
}
.confirm-value {
color: #333;
font-weight: 500;
}
.confirm-value.highlight {
color: #409EFF;
font-weight: 600;
font-size: 14px;
}
.type-badge {
display: inline-block;
padding: 2px 8px;
background: #e6f7ff;
color: #409EFF;
border-radius: 4px;
font-size: 12px;
font-weight: 600;
}
/* 滚动条样式 */
.confirm-list::-webkit-scrollbar {
width: 6px;
}
.confirm-list::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 3px;
}
.confirm-list::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 3px;
}
.confirm-list::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}

BIN
images/delete_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -0,0 +1,978 @@
// H5移动端 - 车辆需求计划申请页面
let form, laydate, layer, upload;
let fileList = new Array();
let addNum = 0;
let addNums = 1;
// 页面初始化
layui.use(['form', 'layer', 'laydate', 'upload'], function () {
form = layui.form;
layer = layui.layer;
laydate = layui.laydate;
upload = layui.upload;
// 检查是否有从选择页面返回的数据
checkSelectedData();
// 初始化日期选择器
laydate.render({
elem: '#needTime',
type: 'date'
});
// 表单提交
form.on('submit(formData)', function (data) {
// 提交逻辑稍后处理
return false;
});
// 计划类型切换
form.on('radio(type)', function (data) {
// 切换类型时清空已选数据(如果有)
});
// 字符计数
$('#remark').on('input', function () {
let length = $(this).val().length;
$('#charCount').text(length);
});
// 文件上传初始化 - 使用原生方式
initFileUpload();
form.render();
// 优化下拉选择框宽度
optimizeSelectWidth();
// 监听下拉框打开事件,确保宽度一致
$(document).on('click', '.layui-form-select .layui-select-title', function () {
setTimeout(function () {
optimizeSelectWidth();
// 确保搜索输入框可以正常使用
ensureSearchInput();
}, 100);
});
// 监听窗口大小改变
$(window).on('resize', function () {
optimizeSelectWidth();
});
// 监听下拉框关闭事件
$(document).on('click', function (e) {
if (!$(e.target).closest('.layui-form-select').length) {
setTimeout(function () {
optimizeSelectWidth();
}, 50);
}
});
// 不拦截layui的搜索事件让layui自己处理过滤
// layui会自动处理搜索过滤我们只需要确保样式正确
});
// 优化下拉选择框宽度,使选项框与选择框宽度一致
function optimizeSelectWidth() {
$('.layui-form-select').each(function () {
const $select = $(this);
const selectWidth = $select.outerWidth();
const $dl = $select.find('dl');
if ($dl.length > 0 && selectWidth > 0) {
// 统一设置下拉列表宽度与选择框一致,在选择框下方显示
$dl.css({
'width': selectWidth + 'px',
'min-width': selectWidth + 'px',
'max-width': selectWidth + 'px',
'left': '0px',
'right': 'auto',
'position': 'absolute'
});
// 确保所有选项项宽度为100%,文本可以换行
$dl.find('dd').css({
'width': '100%',
'box-sizing': 'border-box',
'white-space': 'normal',
'word-wrap': 'break-word',
'word-break': 'break-all'
});
}
});
}
// 确保搜索输入框正常显示和工作
function ensureSearchInput() {
// 查找所有layui搜索输入框只确保宽度正确不干扰layui的过滤逻辑
$('.layui-form-select dl input[type="text"], .layui-form-select dl input.layui-input').each(function () {
const $input = $(this);
const $dl = $input.closest('dl');
// 确保搜索输入框宽度正确
if ($dl.length > 0) {
const dlWidth = $dl.width();
$input.css('width', dlWidth + 'px');
}
});
}
// 工程下拉选
function getProList() {
let url = dataUrl + 'backstage/carType/getProListSelected';
ajaxRequest(url, "POST", null, false, function () {
}, function (result) {
if (result.code === 200) {
setSelectData(result.data);
}
}, function (xhr, status, error) {
errorFn(xhr, status, error)
}, null);
}
// 工程下拉选赋值
function setSelectData(proList) {
let html = '<option value="">请选择工程</option>';
$.each(proList, function (index, item) {
html += '<option value="' + item.id + '">' + item.name + '</option>'
})
$('#proId').empty().append(html);
layui.form.render();
}
// ========== 选择类型页面相关变量和函数 ==========
let selectPageNum = 1;
let selectPageSize = 10;
let selectTotalPages = 1;
let selectSelectedItems = []; // 选中的项目
let selectAllItems = []; // 所有项目数据
// 选择类型 - 显示内嵌的选择页面
function chooseFitType() {
// 获取当前计划类型
const type = $('input[name="type"]:checked').val() || '1';
// 显示选择类型页面
$('#selectTypePage').show();
$('.h5-container').first().hide(); // 隐藏主表单容器
$('.fixed-submit-btn').hide(); // 隐藏提交按钮
// 初始化选择类型页面
initSelectTypePage(type);
}
// 初始化选择类型页面
function initSelectTypePage(type) {
// 重置数据
selectPageNum = 1;
selectSelectedItems = [];
selectAllItems = [];
// 如果有已选数据,加载到选中列表
if (currentSelectedData && currentSelectedData.length > 0) {
selectSelectedItems = currentSelectedData.map(item => ({ ...item }));
}
// 更新选中数量显示
updateSelectSelectedCount();
// 加载数据
loadSelectData(type);
}
// 加载选择类型数据
function loadSelectData(type) {
const id = parseInt(type) === 1 ? 2 : 3;
let url = dataUrl + "backstage/carType/getCarSelected";
let params = {
pageNum: selectPageNum,
pageSize: selectPageSize,
encryptedData: JSON.stringify({
name: $('#selectName').val(),
model: $('#selectModel').val(),
id: id,
})
};
ajaxRequest(url, "GET", params, true, function () {
// loading
}, function (result) {
if (result.list && result.list.length > 0) {
selectAllItems = (result.list || []).map(item => {
// 检查是否在预选数据中
const preselectedItem = selectSelectedItems.find(selected => String(selected.id) === String(item.id));
return {
...item,
backDate: preselectedItem ? (preselectedItem.backDate || preselectedItem.times || 0) : (item.backDate || item.times || 0),
carSpec: preselectedItem ? (preselectedItem.carSpec || '') : (item.carSpec || ''),
needNum: preselectedItem ? (preselectedItem.needNum || 0) : (item.needNum || 0),
remark: preselectedItem ? (preselectedItem.remark || preselectedItem.remarks || '') : (item.remark || item.remarks || '')
};
});
selectTotalPages = Math.ceil((result.total || 0) / selectPageSize);
renderSelectList();
updateSelectPagination();
updateSelectSelectedCount();
} else {
showSelectEmptyState();
}
}, function (xhr, status, error) {
errorFn(xhr, status, error);
showSelectEmptyState();
});
}
// 渲染选择列表
function renderSelectList() {
if (!selectAllItems || selectAllItems.length === 0) {
showSelectEmptyState();
return;
}
let html = '';
selectAllItems.forEach((item, index) => {
const idStr = String(item.id);
const selectedItem = selectSelectedItems.find(selected => String(selected.id) === idStr);
const isSelected = !!selectedItem;
const itemNumber = (selectPageNum - 1) * selectPageSize + index + 1;
const needNum = isSelected && selectedItem.needNum ? selectedItem.needNum : (item.needNum || '');
const backDate = isSelected && selectedItem.backDate ? selectedItem.backDate : (item.backDate || item.times || '');
const carSpec = isSelected && selectedItem.carSpec ? selectedItem.carSpec : (item.carSpec || '');
const remark = isSelected && selectedItem.remark ? selectedItem.remark : (item.remark || item.remarks || '');
html += `
<div class="list-item ${isSelected ? 'selected' : ''}" data-id="${item.id}">
<div class="item-header">
<div class="item-checkbox-wrapper">
<input type="checkbox" class="item-checkbox" ${isSelected ? 'checked' : ''}
data-item-id="${item.id}">
</div>
<div class="item-content">
<div class="item-number">${itemNumber}</div>
<div class="item-basic-info">
<div class="info-row info-row-1">
<div>
<span class="info-label">类型:</span>
<span class="info-value type-tag">${item.type || ''}</span>
</div>
<div class="info-row-item-1">
<span class="info-label">单位:</span>
<span class="info-value">${item.unit || ''}</span>
</div>
</div>
<div class="info-row">
<span class="info-label">名称:</span>
<span class="info-value name-text">${item.name || ''}</span>
</div>
<div class="info-row">
<span class="info-label">规格:</span>
<span class="info-value spec-text">${item.model || ''}</span>
</div>
</div>
</div>
</div>
<div class="item-body">
<div class="form-row">
<label class="form-label required">需用量</label>
<div class="form-input">
<input type="number" class="layui-input" name="selectNeedNum_${item.id}"
value="${needNum}" placeholder="请输入"
onblur="updateSelectItemField(${item.id}, 'needNum', this.value)"
maxlength="9">
</div>
</div>
<div class="form-row">
<label class="form-label required">使用天数</label>
<div class="form-input">
<input type="number" class="layui-input" name="selectBackDate_${item.id}"
value="${backDate}" placeholder="请输入使用天数"
onblur="updateSelectItemField(${item.id}, 'backDate', this.value)"
maxlength="9">
</div>
</div>
<div class="form-row">
<label class="form-label">所需规格</label>
<div class="form-input">
<input type="text" class="layui-input" name="selectCarSpec_${item.id}"
value="${carSpec}" placeholder="请输入所需规格"
onblur="updateSelectItemField(${item.id}, 'carSpec', this.value)"
maxlength="50">
</div>
</div>
<div class="form-row">
<label class="form-label">备注</label>
<div class="form-input">
<textarea class="layui-textarea" name="selectRemark_${item.id}"
placeholder="请输入备注"
onblur="updateSelectItemField(${item.id}, 'remark', this.value)"
maxlength="255">${remark}</textarea>
</div>
</div>
</div>
</div>
`;
});
$('#selectListContainer').html(html);
$('#selectPaginationBox').show();
// 绑定复选框事件
$(document).off('change', '#selectListContainer .item-checkbox').on('change', '#selectListContainer .item-checkbox', function () {
const $checkbox = $(this);
const itemId = $checkbox.data('item-id');
const checked = $checkbox.is(':checked');
toggleSelectItem(itemId, checked);
});
}
// 切换选中状态
function toggleSelectItem(id, checked) {
const idStr = String(id);
const item = selectAllItems.find(item => String(item.id) === idStr);
if (!item) return;
if (checked) {
const existingIndex = selectSelectedItems.findIndex(selected => String(selected.id) === idStr);
if (existingIndex === -1) {
const needNum = $(`input[name="selectNeedNum_${id}"]`).val() || item.needNum || 0;
const backDate = $(`input[name="selectBackDate_${id}"]`).val() || item.backDate || item.times || 0;
const carSpec = $(`input[name="selectCarSpec_${id}"]`).val() || item.carSpec || '';
const remark = $(`textarea[name="selectRemark_${id}"]`).val() || item.remark || item.remarks || '';
selectSelectedItems.push({
...item,
needNum: needNum,
backDate: backDate,
carSpec: carSpec,
remark: remark
});
} else {
const needNum = $(`input[name="selectNeedNum_${id}"]`).val() || selectSelectedItems[existingIndex].needNum || 0;
const backDate = $(`input[name="selectBackDate_${id}"]`).val() || selectSelectedItems[existingIndex].backDate || 0;
const carSpec = $(`input[name="selectCarSpec_${id}"]`).val() || selectSelectedItems[existingIndex].carSpec || '';
const remark = $(`textarea[name="selectRemark_${id}"]`).val() || selectSelectedItems[existingIndex].remark || '';
selectSelectedItems[existingIndex] = {
...selectSelectedItems[existingIndex],
needNum: needNum,
backDate: backDate,
carSpec: carSpec,
remark: remark
};
}
} else {
selectSelectedItems = selectSelectedItems.filter(selected => String(selected.id) !== idStr);
}
updateSelectSelectedCount();
const $item = $(`.list-item[data-id="${id}"]`);
if (checked) {
$item.addClass('selected');
} else {
$item.removeClass('selected');
}
}
// 更新选择项字段
function updateSelectItemField(id, field, value) {
const selectedItem = selectSelectedItems.find(item => String(item.id) === String(id));
if (selectedItem) {
selectedItem[field] = value;
}
const allItem = selectAllItems.find(item => String(item.id) === String(id));
if (allItem) {
allItem[field] = value;
}
}
// 更新选中数量
function updateSelectSelectedCount() {
$('#selectedNum').text(selectSelectedItems.length);
}
// 更新分页显示
function updateSelectPagination() {
$('#selectPageInfo').text(`${selectPageNum}/${selectTotalPages}`);
const $prevBtn = $('#selectPrevPage');
const $nextBtn = $('#selectNextPage');
if (selectPageNum === 1) {
$prevBtn.prop('disabled', true).addClass('layui-btn-disabled');
} else {
$prevBtn.prop('disabled', false).removeClass('layui-btn-disabled');
}
if (selectPageNum >= selectTotalPages) {
$nextBtn.prop('disabled', true).addClass('layui-btn-disabled');
} else {
$nextBtn.prop('disabled', false).removeClass('layui-btn-disabled');
}
}
// 显示空状态
function showSelectEmptyState() {
$('#selectListContainer').html(`
<div class="empty-state">
<i class="layui-icon layui-icon-file"></i>
<p>暂无数据</p>
</div>
`);
$('#selectPaginationBox').hide();
}
// 查询/重置
function querySelectTable(type) {
if (type === 1) {
selectPageNum = 1;
const currentType = $('input[name="type"]:checked').val() || '1';
loadSelectData(currentType);
} else if (type === 2) {
$('#selectName').val('');
$('#selectModel').val('');
selectPageNum = 1;
const currentType = $('input[name="type"]:checked').val() || '1';
loadSelectData(currentType);
}
}
// 上一页
function selectPrevPage() {
if (selectPageNum > 1) {
selectPageNum--;
const currentType = $('input[name="type"]:checked').val() || '1';
loadSelectData(currentType);
}
}
// 下一页
function selectNextPage() {
if (selectPageNum < selectTotalPages) {
selectPageNum++;
const currentType = $('input[name="type"]:checked').val() || '1';
loadSelectData(currentType);
}
}
// 关闭选择类型页面
function closeSelectTypePage() {
// 隐藏选择类型页面
$('#selectTypePage').hide();
// 显示主表单容器
$('.h5-container').first().show();
// 显示提交按钮
$('.fixed-submit-btn').show();
}
// 确认选择类型
function confirmSelectType() {
if (selectSelectedItems.length === 0) {
return layer.msg('未添加数据', { icon: 7 });
}
// 先同步更新所有已选项目的输入框值
selectSelectedItems.forEach(item => {
const needNum = $(`input[name="selectNeedNum_${item.id}"]`).val();
const backDate = $(`input[name="selectBackDate_${item.id}"]`).val();
const carSpec = $(`input[name="selectCarSpec_${item.id}"]`).val();
const remark = $(`textarea[name="selectRemark_${item.id}"]`).val();
item.needNum = needNum || item.needNum || 0;
item.backDate = backDate || item.backDate || item.times || 0;
item.carSpec = carSpec || item.carSpec || '';
item.remark = remark || item.remark || item.remarks || '';
});
// 验证必填字段
for (let i = 0; i < selectSelectedItems.length; i++) {
const item = selectSelectedItems[i];
if (!item.needNum || parseInt(item.needNum) === 0) {
return layer.msg(`${i + 1}项需用量不能为空`, { icon: 7 });
}
if (!item.backDate || parseInt(item.backDate) === 0) {
return layer.msg(`${i + 1}项使用天数不能为空`, { icon: 7 });
}
}
// 保存到currentSelectedData
currentSelectedData = selectSelectedItems.map(item => ({
id: item.id,
type: item.type,
name: item.name,
model: item.model,
unit: item.unit,
needNum: item.needNum,
backDate: item.backDate || 0,
carSpec: item.carSpec || '',
remark: item.remark || ''
}));
// 更新显示
if (currentSelectedData.length > 0) {
$('#no_data_title').hide();
$('#has_data_title').show();
$('#selectedCountDisplay').text(currentSelectedData.length);
} else {
$('#no_data_title').show();
$('#has_data_title').hide();
}
// 关闭选择页面
closeSelectTypePage();
layer.msg('选择成功', { icon: 1 });
}
// 添加途径点
function addTjd() {
addNum = addNum + 1;
addNums++;
if (addNums > 10) {
addNum = 10;
addNums = 10;
layer.msg('途径点不能超过10个!', { icon: 5 });
return false;
}
let html = '<div class="layui-form-item addTjd">' +
'<label class="layui-form-label">途经点</label>' +
'<div class="layui-input-block">' +
'<input class="layui-input addTjdInput" name="routePoint" autocomplete="off" maxlength="30" placeholder="输入内容">' +
'<img style="cursor: pointer;" onclick="delTjd(this,' + addNum + ')" src="../../../images/delete_icon.png">' +
'</div>' +
'</div>';
// <img style="cursor: pointer;" onclick="delTjd(this,' + addNum + ')" src="../../../images/delete_icon.png">
let addTjdNum = $('.addTjd').length;
if (addTjdNum === 0) {
$('#tjd').after(html);
} else {
$('.addTjd').eq(addTjdNum - 1).after(html);
}
layui.form.render();
}
// 删除途径点
function delTjd(that, addNum) {
addNums = addNums - 1;
// 使用closest查找最近的.addTjd父元素
$(that).closest('.addTjd').remove();
}
// 初始化文件上传(原生方式)
function initFileUpload() {
const fileInput = document.getElementById('fileInput');
if (!fileInput) {
console.error('文件输入框不存在');
return;
}
// 给input添加点击事件调试用
fileInput.addEventListener('click', function (e) {
}, true);
// 给按钮添加点击事件 - 手动触发input
setTimeout(function () {
$('.upload-btn').on('click', function (e) {
// 阻止事件冒泡到form避免被form的onclick阻止
e.stopPropagation();
// 使用原生方式触发,确保能弹出文件选择器
if (fileInput) {
// 延迟一点触发,确保事件处理完成
setTimeout(function () {
fileInput.click();
}, 10);
}
});
// 给包装器添加点击事件 - 手动触发input
$('.upload-btn-wrapper').on('click', function (e) {
// 如果点击的不是input本身则触发input
if (e.target !== fileInput && !$(e.target).closest('#fileInput').length) {
e.stopPropagation(); // 阻止冒泡到form
setTimeout(function () {
fileInput.click();
}, 10);
}
});
// 给上传区域添加点击事件(调试用)
$('.upload-area').on('click', function (e) {
});
// 给input本身添加点击事件确保不被form阻止
$(fileInput).on('click', function (e) {
e.stopPropagation(); // 阻止冒泡到form
});
}, 100);
// 确保input的点击事件不被阻止
fileInput.addEventListener('click', function (e) {
// 阻止事件冒泡到form避免被form的onclick阻止
e.stopPropagation();
// 不阻止默认行为,让浏览器正常处理
}, false);
// 监听文件选择
fileInput.addEventListener('change', function (e) {
const files = e.target.files;
if (!files || files.length === 0) {
return;
}
// 检查已上传文件数量
let length = $('.file-iteme').length;
if (length >= 5) {
layer.msg('最多上传5个附件证明', { icon: 7 });
fileInput.value = ''; // 清空选择
return;
}
// 处理每个文件
Array.from(files).forEach((file, fileIndex) => {
if (length >= 5) {
return; // 已达到最大数量
}
// 验证文件大小10MB = 1024 * 10 KB
const maxSize = 1024 * 10; // 10MB
if (file.size > maxSize * 1024) {
layer.msg(`文件 ${file.name} 超过10MB限制`, { icon: 7 });
return;
}
// 验证文件类型
const allowedTypes = [
'image/jpg', 'image/png', 'image/jpeg',
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
];
const fileExt = file.name.split('.').pop().toLowerCase();
const allowedExts = ['jpg', 'png', 'jpeg', 'doc', 'docx', 'pdf', 'xlsx', 'xls'];
if (!allowedExts.includes(fileExt)) {
layer.msg(`文件 ${file.name} 格式不支持`, { icon: 7 });
return;
}
const index = fileList.length; // 使用fileList的长度作为index
// 判断是否为图片文件
const isImage = file.type.startsWith('image/');
if (isImage) {
// 图片文件使用FileReader读取预览
const reader = new FileReader();
reader.onload = function (e) {
const result = e.target.result;
// 添加到文件列表
$('#uploader-list').append(
'<div class="file-iteme">' +
'<div class="handle"><p>x</p></div>' +
handleFileType(index, file, result, true) +
'</div>'
);
// 保存文件信息
let map = new Map();
map.index = index;
map.file = file;
fileList.push(map);
length++;
};
reader.readAsDataURL(file);
} else {
// 非图片文件直接显示图标不需要FileReader
// 添加到文件列表
$('#uploader-list').append(
'<div class="file-iteme">' +
'<div class="handle"><p>x</p></div>' +
handleFileType(index, file, null, false) +
'</div>'
);
// 保存文件信息
let map = new Map();
map.index = index;
map.file = file;
fileList.push(map);
length++;
}
});
// 清空input值允许重复选择相同文件
fileInput.value = '';
});
}
// 处理文件类型显示
function handleFileType(index, file, result, isImage) {
// 获取文件扩展名
const fileName = file.name || '';
const fileExt = fileName.split('.').pop().toLowerCase();
// 根据当前页面路径计算图片路径
const basePath = '../../../images/';
if (isImage && result) {
// 图片文件:显示预览图
return '<img class="file-preview-img" data-index="' + index + '" data-name="' + fileName + '" src="' + result + '">';
} else {
// 非图片文件:显示图标盒子
let iconPath = '';
if (fileExt === 'doc' || fileExt === 'docx') {
iconPath = basePath + 'docx.png';
} else if (fileExt === 'xls' || fileExt === 'xlsx') {
iconPath = basePath + 'xlsx.png';
} else if (fileExt === 'pdf') {
iconPath = basePath + 'pdf.png';
} else {
// 默认图标
iconPath = basePath + 'file_icon.png';
}
// 截取文件名(如果太长)
const displayName = fileName.length > 8 ? fileName.substring(0, 8) + '...' : fileName;
return '<div class="file-preview-box" data-index="' + index + '">' +
'<img class="file-icon" src="' + iconPath + '" alt="' + fileExt + '">' +
'<p class="file-name">' + displayName + '</p>' +
'</div>';
}
}
// 删除文件
$(document).on("click", ".file-iteme .handle", function (event) {
event.stopPropagation();
let imgListUp = new Array();
// 查找data-index属性可能在img、file-preview-img或file-preview-box上
const $fileItem = $(this).closest('.file-iteme');
let index = $fileItem.find('[data-index]').attr('data-index') ||
$(this).next().attr('data-index') ||
$(this).next().find('[data-index]').attr('data-index');
$.each(fileList, function (inx, ele) {
if (index != ele.index) {
imgListUp.push(ele);
}
});
$fileItem.remove();
fileList.splice(0, fileList.length);
$.each(imgListUp, function (inx, ele) {
fileList.push(ele);
});
});
// 提交申请
function saveData2() {
$('#formSubmit').trigger('click');
}
// 存储已选数据(用于传递给选择页面)
let currentSelectedData = [];
// 检查从选择页面返回的数据
function checkSelectedData() {
const selectedData = sessionStorage.getItem('selectedTypeData');
if (selectedData) {
try {
const data = JSON.parse(selectedData);
if (data && data.length > 0) {
// 保存已选数据
currentSelectedData = data;
// 隐藏空状态,显示已选数量
$('#no_data_title').hide();
$('#has_data_title').show();
$('#selectedCountDisplay').text(data.length);
// 清除sessionStorage因为我们已经保存到currentSelectedData了
sessionStorage.removeItem('selectedTypeData');
} else {
// 没有数据,显示空状态
$('#no_data_title').show();
$('#has_data_title').hide();
currentSelectedData = [];
}
} catch (e) {
console.error('解析选中数据失败:', e);
sessionStorage.removeItem('selectedTypeData');
$('#no_data_title').show();
$('#has_data_title').hide();
currentSelectedData = [];
}
} else {
// 没有数据,显示空状态
$('#no_data_title').show();
$('#has_data_title').hide();
currentSelectedData = [];
}
}
// 关闭页面
function closePage() {
// H5页面返回
if (window.history.length > 1) {
window.history.back();
} else {
// 如果没有历史记录,可以跳转到首页或其他页面
// window.location.href = '/';
}
}
getProList();
// 确认提交
function submitApply() {
// 1. 字段校验
// 校验计划类型
const type = $('input[name="type"]:checked').val();
if (!type) {
return layer.msg('请选择计划类型', { icon: 7 });
}
// 校验申请工程
const proId = $('#proId').val();
if (!proId) {
return layer.msg('请选择申请工程', { icon: 7 });
}
// 校验需用日期
const needTime = $('#needTime').val();
if (!needTime) {
return layer.msg('请选择需用日期', { icon: 7 });
}
// 校验项目部分
const projectPart = $('#projectPart').val();
if (!projectPart || projectPart.trim() === '') {
return layer.msg('请输入项目部分', { icon: 7 });
}
if (projectPart.length > 50) {
return layer.msg('项目部分不能超过50个字符', { icon: 7 });
}
// 校验计划说明
const remark = $('#remark').val();
if (!remark || remark.trim() === '') {
return layer.msg('请输入计划说明', { icon: 7 });
}
if (remark.length > 500) {
return layer.msg('计划说明不能超过500个字符', { icon: 7 });
}
// 校验是否选择了车辆/吊车类型
if (!currentSelectedData || currentSelectedData.length === 0) {
return layer.msg('请至少选择一种车辆或吊车类型', { icon: 7 });
}
// 校验已选数据的必填字段
for (let i = 0; i < currentSelectedData.length; i++) {
const item = currentSelectedData[i];
if (!item.needNum || parseInt(item.needNum) === 0) {
return layer.msg(`${i + 1}项需用量不能为空`, { icon: 7 });
}
if (parseInt(item.needNum) > 10) {
return layer.msg(`${i + 1}项需用量不能超过10`, { icon: 7 });
}
if (!item.backDate || parseInt(item.backDate) === 0) {
return layer.msg(`${i + 1}项使用天数不能为空`, { icon: 7 });
}
}
// 2. 组装途径点字符串(使用逗号拼接)
let routePointStr = '';
$('input[name="routePoint"]').each(function (index, item) {
const routePoint = $(this).val();
if (routePoint && routePoint.trim() !== '') {
if (routePointStr !== '') {
routePointStr += 'routePoint;' + routePoint.trim();
} else {
routePointStr = routePoint.trim();
}
}
});
// 3. 组装detailList
const detailList = currentSelectedData.map(item => {
return {
modelId: item.id || item.modelId || '',
type: item.type || '',
name: item.name || '',
model: item.model || '',
unit: item.unit || '',
carSpec: item.carSpec || '',
needNum: item.needNum || '0',
backDate: item.backDate || '0',
remark: item.remark || ''
};
});
// 4. 组装params对象
const params = {
type: type,
proId: proId,
needTime: needTime,
projectPart: projectPart.trim(),
remark: remark.trim(),
carWeight: $('#carWeight').val() || '',
carStart: $('#carStart').val() || '',
carEnd: $('#carEnd').val() || '',
routePoint: routePointStr,
detailList: detailList,
applyType: '0' // 固定为0
};
// 5. 打印参数(调试用)
console.log('提交参数:', params);
console.log('途径点字符串:', routePointStr);
console.log('文件数量:', fileList.length);
// 6. 创建FormData
let loadingMsg = layer.msg('正在提交保存,请稍等...', { icon: 16, shade: 0.01, time: '0' });
let url = dataUrl + 'backstage/carNeedPlan/addNeedPlanData';
let formData = new FormData();
// 7. 添加文件
for (let i = 0; i < fileList.length; i++) {
formData.append("file[]", fileList[i].file);
}
// 8. 添加params转为JSON字符串
formData.append('params', JSON.stringify(params));
// 9. 调用接口
ajaxRequestByUploadFile(url, formData, function () {
// loading
}, function (result) {
layer.close(loadingMsg);
if (result.code === 200) {
layer.msg('提交成功', { icon: 1 }, function () {
// 提交成功后刷新页面
// window.location.reload();
});
} else {
layer.msg(result.msg || '提交失败', { icon: 7 });
}
}, function (xhr, status, error) {
layer.close(loadingMsg);
errorFn(xhr, status, error);
}, null);
}

View File

@ -0,0 +1,535 @@
// H5移动端 - 选择类型页面
let form, layer, laydate;
let pageNum = 1;
let pageSize = 10;
let totalPages = 1;
let selectedItems = []; // 选中的项目
let allItems = []; // 所有项目数据
let typeParam = ''; // 类型参数
// 页面初始化
layui.use(['form', 'layer', 'laydate'], function () {
form = layui.form;
layer = layui.layer;
laydate = layui.laydate;
// 获取URL参数
const urlParams = new URLSearchParams(window.location.search);
typeParam = urlParams.get('type') || '1';
// 检查是否有预选数据(从主页面传递过来的)
checkPreselectedData();
// 初始化数据
initData();
});
// 检查预选数据(从主页面传递过来的已选数据)
function checkPreselectedData() {
const preselectedData = sessionStorage.getItem('preselectedTypeData');
if (preselectedData) {
try {
const data = JSON.parse(preselectedData);
if (data && data.length > 0) {
// 将预选数据转换为selectedItems格式
selectedItems = data.map(item => ({
...item,
id: item.id,
needNum: item.needNum || 0,
backDate: item.backDate || 0,
carSpec: item.carSpec || '',
remark: item.remark || ''
}));
console.log('预选数据已加载:', selectedItems);
// 清除sessionStorage
sessionStorage.removeItem('preselectedTypeData');
}
} catch (e) {
console.error('解析预选数据失败:', e);
sessionStorage.removeItem('preselectedTypeData');
}
}
}
// 初始化数据
function initData() {
// 加载数据
loadData();
}
// 加载数据(接口调用)
function loadData() {
let url = dataUrl + "backstage/carType/getCarSelected";
let params = {
pageNum: pageNum,
pageSize: pageSize,
encryptedData: JSON.stringify({
name: $('#name').val(),
model: $('#model').val(),
id: parseInt(typeParam) === 1 ? 2 : 3,
})
};
ajaxRequest(url, "GET", params, true, function () {
// loading
}, function (result) {
if (result.list && result.list.length > 0) {
// 对返回的数据进行map添加backDate和carSpec字段
console.log(result.list);
allItems = (result.list || []).map(item => {
// 检查是否在预选数据中,如果在,使用预选数据中的值
const preselectedItem = selectedItems.find(selected => String(selected.id) === String(item.id));
return {
...item,
backDate: preselectedItem ? (preselectedItem.backDate || preselectedItem.times || 0) : (item.backDate || item.times || 0),
carSpec: preselectedItem ? (preselectedItem.carSpec || '') : (item.carSpec || ''),
needNum: preselectedItem ? (preselectedItem.needNum || 0) : (item.needNum || 0),
remark: preselectedItem ? (preselectedItem.remark || preselectedItem.remarks || '') : (item.remark || item.remarks || '')
};
});
totalPages = Math.ceil((result.total || 0) / pageSize);
renderList();
updatePagination();
// 更新选中数量显示
updateSelectedCount();
} else {
showEmptyState();
}
}, function (xhr, status, error) {
errorFn(xhr, status, error);
showEmptyState();
});
}
// 查询/重置
function queryTable(type) {
if (type === 1) {
// 查询
pageNum = 1;
loadData();
} else if (type === 2) {
// 重置
$('#name').val('');
$('#model').val('');
pageNum = 1;
loadData();
}
}
// 渲染列表
function renderList() {
if (!allItems || allItems.length === 0) {
showEmptyState();
return;
}
let html = '';
allItems.forEach((item, index) => {
// 检查是否在已选列表中,搜索时保持已选状态(统一转换为字符串比较)
const idStr = String(item.id);
const selectedItem = selectedItems.find(selected => String(selected.id) === idStr);
const isSelected = !!selectedItem;
const itemNumber = (pageNum - 1) * pageSize + index + 1;
// 如果已选中使用已选数据中的值否则使用当前item的值
const needNum = isSelected && selectedItem.needNum ? selectedItem.needNum : (item.needNum || '');
const backDate = isSelected && selectedItem.backDate ? selectedItem.backDate : (item.backDate || item.times || '');
const carSpec = isSelected && selectedItem.carSpec ? selectedItem.carSpec : (item.carSpec || '');
const remark = isSelected && selectedItem.remark ? selectedItem.remark : (item.remark || item.remarks || '');
html += `
<div class="list-item ${isSelected ? 'selected' : ''}" data-id="${item.id}">
<div class="item-header">
<div class="item-checkbox-wrapper">
<input type="checkbox" class="item-checkbox" ${isSelected ? 'checked' : ''}
data-item-id="${item.id}">
</div>
<div class="item-content">
<div class="item-number">${itemNumber}</div>
<div class="item-basic-info">
<div class="info-row info-row-1">
<div>
<span class="info-label">类型:</span>
<span class="info-value type-tag">${item.type || ''}</span>
</div>
<div class="info-row-item-1">
<span class="info-label">单位:</span>
<span class="info-value">${item.unit || ''}</span>
</div>
</div>
<div class="info-row">
<span class="info-label">名称:</span>
<span class="info-value name-text">${item.name || ''}</span>
</div>
<div class="info-row">
<span class="info-label">规格:</span>
<span class="info-value spec-text">${item.model || ''}</span>
</div>
</div>
</div>
</div>
<div class="item-body">
<div class="form-row">
<label class="form-label required">需用量</label>
<div class="form-input">
<input type="number" class="layui-input" name="needNum_${item.id}"
value="${needNum}" placeholder="请输入"
onblur="updateItemField(${item.id}, 'needNum', this.value)"
maxlength="9">
</div>
</div>
<div class="form-row">
<label class="form-label required">使用天数</label>
<div class="form-input">
<input type="number" class="layui-input" name="backDate_${item.id}"
value="${backDate}" placeholder="请输入使用天数"
onblur="updateItemField(${item.id}, 'backDate', this.value)"
maxlength="9">
</div>
</div>
<div class="form-row">
<label class="form-label">所需规格</label>
<div class="form-input">
<input type="text" class="layui-input" name="carSpec_${item.id}"
value="${carSpec}" placeholder="请输入所需规格"
onblur="updateItemField(${item.id}, 'carSpec', this.value)"
maxlength="50">
</div>
</div>
<div class="form-row">
<label class="form-label">备注</label>
<div class="form-input">
<textarea class="layui-textarea" name="remark_${item.id}"
placeholder="请输入备注"
onblur="updateItemField(${item.id}, 'remark', this.value)"
maxlength="255">${remark}</textarea>
</div>
</div>
</div>
</div>
`;
});
$('#listContainer').html(html);
$('#paginationBox').show();
// 使用事件委托绑定复选框事件
$(document).off('change', '.item-checkbox').on('change', '.item-checkbox', function () {
const $checkbox = $(this);
const itemId = $checkbox.data('item-id');
const checked = $checkbox.is(':checked');
console.log('Checkbox changed:', itemId, checked);
toggleSelect(itemId, checked);
});
}
// 切换选中状态
function toggleSelect(id, checked) {
console.log('toggleSelect called:', id, checked, typeof id);
console.log('allItems length:', allItems.length);
console.log('selectedItems before:', selectedItems.length);
// 统一转换为字符串进行比较,避免类型不匹配
const idStr = String(id);
const item = allItems.find(item => String(item.id) === idStr);
if (!item) {
console.error('Item not found:', id, 'allItems:', allItems.map(i => i.id));
return;
}
if (checked) {
// 勾选时添加到选中列表
const existingIndex = selectedItems.findIndex(selected => String(selected.id) === idStr);
if (existingIndex === -1) {
// 如果不存在,添加新项
const needNum = $(`input[name="needNum_${id}"]`).val() || item.needNum || 0;
const backDate = $(`input[name="backDate_${id}"]`).val() || item.backDate || item.times || 0;
const carSpec = $(`input[name="carSpec_${id}"]`).val() || item.carSpec || '';
const remark = $(`textarea[name="remark_${id}"]`).val() || item.remark || item.remarks || '';
const newItem = {
...item,
needNum: needNum,
backDate: backDate,
carSpec: carSpec,
remark: remark
};
selectedItems.push(newItem);
console.log('Added item:', newItem);
console.log('selectedItems after add:', selectedItems);
} else {
// 如果已存在,更新数据(同步输入框的值)
const needNum = $(`input[name="needNum_${id}"]`).val() || selectedItems[existingIndex].needNum || 0;
const backDate = $(`input[name="backDate_${id}"]`).val() || selectedItems[existingIndex].backDate || 0;
const carSpec = $(`input[name="carSpec_${id}"]`).val() || selectedItems[existingIndex].carSpec || '';
const remark = $(`textarea[name="remark_${id}"]`).val() || selectedItems[existingIndex].remark || '';
selectedItems[existingIndex] = {
...selectedItems[existingIndex],
needNum: needNum,
backDate: backDate,
carSpec: carSpec,
remark: remark
};
console.log('Updated item:', selectedItems[existingIndex]);
}
} else {
// 取消勾选时从选中列表移除
selectedItems = selectedItems.filter(selected => String(selected.id) !== idStr);
console.log('Removed item, selectedItems after:', selectedItems);
}
console.log('selectedItems final:', selectedItems.length, selectedItems);
updateSelectedCount();
updateItemClass(id, checked);
}
// 更新项目字段
function updateItemField(id, field, value) {
// 验证
if (field === 'needNum') {
if (value) {
const regex = /^(0|[1-9]\d{0,6})$/;
if (!regex.test(value) || parseInt(value) > 10) {
layer.msg('需用量格式不正确最大数量只能输入10且为正整数', { icon: 7 });
$(`input[name="needNum_${id}"]`).val('');
return;
}
}
} else if (field === 'backDate') {
if (value) {
const regex = /^[1-9]\d{0,5}$/;
if (!regex.test(value)) {
layer.msg('使用天数只能输入正整数!', { icon: 7 });
$(`input[name="backDate_${id}"]`).val('');
return;
}
}
} else if (field === 'carSpec') {
if (value && value.length > 50) {
layer.msg('所需规格最多输入50位', { icon: 7 });
return;
}
} else if (field === 'remark') {
if (value && value.length > 255) {
layer.msg('备注最多输入255位', { icon: 7 });
return;
}
}
// 更新数据
const selectedItem = selectedItems.find(item => item.id === id);
if (selectedItem) {
selectedItem[field] = value;
}
const allItem = allItems.find(item => item.id === id);
if (allItem) {
allItem[field] = value;
}
}
// 更新选中数量
function updateSelectedCount() {
$('#selectedNum').text(selectedItems.length);
}
// 更新项目样式
function updateItemClass(id, checked) {
const $item = $(`.list-item[data-id="${id}"]`);
if (checked) {
$item.addClass('selected');
} else {
$item.removeClass('selected');
}
}
// 上一页
function prevPage() {
if (pageNum > 1) {
pageNum--;
loadData();
}
}
// 下一页
function nextPage() {
if (pageNum < totalPages) {
pageNum++;
loadData();
}
}
// 更新分页显示
function updatePagination() {
$('#pageInfo').text(`${pageNum}/${totalPages}`);
const $prevBtn = $('#prevPage');
const $nextBtn = $('#nextPage');
if (pageNum === 1) {
$prevBtn.prop('disabled', true).addClass('layui-btn-disabled');
} else {
$prevBtn.prop('disabled', false).removeClass('layui-btn-disabled');
}
if (pageNum >= totalPages) {
$nextBtn.prop('disabled', true).addClass('layui-btn-disabled');
} else {
$nextBtn.prop('disabled', false).removeClass('layui-btn-disabled');
}
}
// 显示空状态
function showEmptyState() {
$('#listContainer').html(`
<div class="empty-state">
<i class="layui-icon layui-icon-file"></i>
<p>暂无数据</p>
</div>
`);
$('#paginationBox').hide();
}
// 保存数据
function saveData2() {
if (selectedItems.length === 0) {
return layer.msg('未添加数据', { icon: 7 });
}
// 先同步更新所有已选项目的输入框值
selectedItems.forEach(item => {
const needNum = $(`input[name="needNum_${item.id}"]`).val();
const backDate = $(`input[name="backDate_${item.id}"]`).val();
const carSpec = $(`input[name="carSpec_${item.id}"]`).val();
const remark = $(`textarea[name="remark_${item.id}"]`).val();
item.needNum = needNum || item.needNum || 0;
item.backDate = backDate || item.backDate || item.times || 0;
item.carSpec = carSpec || item.carSpec || '';
item.remark = remark || item.remark || item.remarks || '';
});
// 验证必填字段
for (let i = 0; i < selectedItems.length; i++) {
const item = selectedItems[i];
if (!item.needNum || parseInt(item.needNum) === 0) {
return layer.msg(`${i + 1}项需用量不能为空`, { icon: 7 });
}
if (!item.backDate || parseInt(item.backDate) === 0) {
return layer.msg(`${i + 1}项使用天数不能为空`, { icon: 7 });
}
}
// 显示确认弹框,展示已选数据
showConfirmDialog();
}
// 显示确认弹框
function showConfirmDialog() {
let confirmHtml = `
<div class="confirm-dialog-content">
<div class="confirm-title">
<i class="layui-icon layui-icon-tips" style="color: #409EFF; font-size: 20px;"></i>
<span style="font-size: 16px; font-weight: 600; margin-left: 8px;">确认添加数据</span>
</div>
<div class="confirm-tip" style="color: #ff5722; margin: 12px 0; font-size: 14px;">
<i class="layui-icon layui-icon-about"></i>
数据即将被添加请仔细检查数据是否有错误
</div>
<div class="confirm-list">
<div class="confirm-list-header">
<span>已选数据列表 ${selectedItems.length} </span>
</div>
<div class="confirm-list-body">
`;
selectedItems.forEach((item, index) => {
confirmHtml += `
<div class="confirm-item">
<div class="confirm-item-number">${index + 1}</div>
<div class="confirm-item-content">
<div class="confirm-item-row">
<span class="confirm-label">类型:</span>
<span class="confirm-value type-badge">${item.type || ''}</span>
<span class="confirm-label">单位:</span>
<span class="confirm-value">${item.unit || ''}</span>
</div>
<div class="confirm-item-row">
<span class="confirm-label">名称:</span>
<span class="confirm-value">${item.name || ''}</span>
</div>
<div class="confirm-item-row">
<span class="confirm-label">规格:</span>
<span class="confirm-value">${item.model || ''}</span>
</div>
<div class="confirm-item-row">
<span class="confirm-label">需用量:</span>
<span class="confirm-value highlight">${item.needNum || 0}</span>
<span class="confirm-label">使用天数:</span>
<span class="confirm-value highlight">${item.backDate || 0}</span>
</div>
${item.carSpec ? `
<div class="confirm-item-row">
<span class="confirm-label">所需规格:</span>
<span class="confirm-value">${item.carSpec}</span>
</div>
` : ''}
${item.remark ? `
<div class="confirm-item-row">
<span class="confirm-label">备注:</span>
<span class="confirm-value">${item.remark}</span>
</div>
` : ''}
</div>
</div>
`;
});
confirmHtml += `
</div>
</div>
</div>
`;
layer.open({
type: 1,
title: false,
closeBtn: 1,
area: ['90%', '70%'],
shadeClose: false,
content: confirmHtml,
btn: ['确认添加', '取消'],
btnAlign: 'c',
yes: function (index) {
layer.close(index);
// 确认后保存数据
const dataToSave = selectedItems.map(item => ({
id: item.id,
type: item.type || typeParam,
name: item.name,
model: item.model,
unit: item.unit,
needNum: item.needNum,
backDate: item.backDate || 0,
carSpec: item.carSpec || '',
remark: item.remark || ''
}));
sessionStorage.setItem('selectedTypeData', JSON.stringify(dataToSave));
// 返回上一页
window.history.back();
},
btn2: function (index) {
layer.close(index);
}
});
}
// 关闭页面
function closePage() {
// window.history.back();
window.location.href = 'http://192.168.2.140:5500/page/car_demand_plan/H5/demand_plan_apply/index.html';
}

View File

@ -0,0 +1,265 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>车辆需求计划申请</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="stylesheet" href="../../../../lib/layui-v2.9.18/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../../../css/font.css" media="all">
<link rel="stylesheet" href="../../../../css/car_demand_plan/H5/demand_plan_apply.css" media="all">
<link rel="stylesheet" href="../../../../css/car_demand_plan/H5/select_type.css" media="all">
</head>
<body>
<!-- 顶部标题栏 -->
<div class="h5-header">
<div class="header-content">
<i class="layui-icon layui-icon-setting"></i>
<span class="header-title">贵送机具管理系统</span>
</div>
</div>
<div class="h5-container">
<!-- 表单卡片 -->
<div class="form-card">
<div class="card-header">
<i class="layui-icon layui-icon-file"></i>
<span class="card-title">车辆需求计划申请</span>
<!-- <button class="return-btn" onclick="closePage()">
<i class="layui-icon layui-icon-left"></i>
<span>返回</span>
</button> -->
</div>
<form class="layui-form" id="applyForm">
<!-- 计划类型 -->
<div class="layui-form-item">
<label class="layui-form-label required">计划类型</label>
<div class="layui-input-block">
<input type="radio" lay-filter="type" name="type" value="1" title="运输车辆" checked>
<input type="radio" lay-filter="type" name="type" value="2" title="吊车">
</div>
</div>
<!-- 申请工程 -->
<div class="layui-form-item">
<label class="layui-form-label required">申请工程</label>
<div class="layui-input-block">
<select name="proId" id="proId" lay-verify="required" lay-search>
<option value="">选择工程</option>
</select>
</div>
</div>
<!-- 需用日期 -->
<div class="layui-form-item">
<label class="layui-form-label required">需用日期</label>
<div class="layui-input-block">
<input class="layui-input" id="needTime" autocomplete="off" name="needTime"
lay-verify="required" readonly placeholder="选择日期">
</div>
</div>
<!-- 项目部分 -->
<div class="layui-form-item">
<label class="layui-form-label required">项目部分</label>
<div class="layui-input-block">
<input class="layui-input" name="projectPart" id="projectPart" autocomplete="off"
lay-verify="required" maxlength="50" placeholder="输入内容">
</div>
</div>
<!-- 计划说明 -->
<div class="layui-form-item">
<label class="layui-form-label required">计划说明</label>
<div class="layui-input-block">
<textarea placeholder="请输入" lay-verify="required" id="remark" name="remark"
class="layui-textarea" maxLength="500" lay-affix="clear"></textarea>
<div class="char-count"><span id="charCount">0</span>/500</div>
</div>
</div>
<!-- 预计运输物品质量 -->
<div class="layui-form-item">
<label class="layui-form-label">预计运输物品质量</label>
<div class="layui-input-block">
<div class="input-with-unit">
<input class="layui-input" name="carWeight" id="carWeight" autocomplete="off" maxlength="50"
type="number" placeholder="输入内容">
<span class="unit"></span>
</div>
</div>
</div>
<!-- 运输起点 -->
<div class="layui-form-item">
<label class="layui-form-label">运输起点</label>
<div class="layui-input-block">
<input class="layui-input" name="carStart" id="carStart" autocomplete="off" maxlength="50"
placeholder="输入内容">
</div>
</div>
<!-- 运输终点 -->
<div class="layui-form-item">
<label class="layui-form-label">运输终点</label>
<div class="layui-input-block">
<input class="layui-input" name="carEnd" id="carEnd" autocomplete="off" maxlength="50"
placeholder="输入内容">
</div>
</div>
<!-- 途经点 -->
<div class="layui-form-item" id="tjd">
<label class="layui-form-label">途经点</label>
<div class="layui-input-block">
<input class="layui-input" name="routePoint" autocomplete="off" maxlength="30"
placeholder="输入内容">
</div>
</div>
<div class="route-point-tip">
<p>多个途径点请点击继续,最多10个</p>
<div class="add-route-btn" onclick="addTjd()">
<i class="layui-icon layui-icon-add-1"></i>
<span>添加途径点</span>
</div>
</div>
<!-- 上传附件 -->
<div class="layui-form-item">
<label class="layui-form-label">上传附件</label>
<div class="layui-input-block">
<div class="upload-area">
<div class="layui-upload-list uploader-list" id="uploader-list"></div>
<div class="upload-btn-wrapper">
<input type="file" id="fileInput" multiple
accept="image/jpg,image/png,image/jpeg,application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
<div class="upload-btn">
<i class="layui-icon layui-icon-add-1"></i>
</div>
</div>
</div>
<div class="upload-tip">
<p>请上传运输起始点高德地图截图</p>
</div>
</div>
</div>
<button type="submit" id="formSubmit" class="layui-btn" lay-submit="" lay-filter="formData"
style="display: none;"></button>
</form>
</div>
<!-- 申请明细卡片 -->
<div class="form-card">
<div class="card-header">
<i class="layui-icon layui-icon-file"></i>
<span class="card-title">申请明细</span>
</div>
<!-- 无数据时-展示 -->
<div id="no_data_title" class="no-data-container">
<p class="no-data-text">您还没选择需用车辆吊车类型</p>
<p class="no-data-tip">请先添加机具类型后再执申请操作</p>
<button class="layui-btn layui-bg-blue" onclick="chooseFitType()">
<i class="layui-icon layui-icon-list"></i>
<span>选择类型</span>
</button>
</div>
<!-- 有数据时-展示 -->
<div id="has_data_title" class="has-data-container" style="display: none;">
<div class="selected-info">
<i class="layui-icon layui-icon-ok-circle" style="color: #5FB878; font-size: 20px;"></i>
<span class="selected-count-text">已选择 <span id="selectedCountDisplay">0</span></span>
</div>
<button class="layui-btn layui-bg-blue" onclick="chooseFitType()">
<i class="layui-icon layui-icon-edit"></i>
<span>重新选择</span>
</button>
</div>
</div>
</div>
<!-- 选择类型页面(内嵌,默认隐藏) -->
<div id="selectTypePage" class="select-type-page" style="display: none;">
<!-- 顶部标题栏 -->
<div class="h5-header">
<div class="header-left">
<i class="layui-icon layui-icon-setting"></i>
<span class="header-title">贵送机具管理系统</span>
</div>
<div class="header-right">
<span class="selected-count">已选: <span id="selectedNum">0</span></span>
<button class="return-btn" onclick="closeSelectTypePage()">
<i class="layui-icon layui-icon-left"></i>
<span>返回</span>
</button>
</div>
</div>
<div class="h5-container">
<!-- 页面标题 -->
<div class="page-title">
<i class="layui-icon layui-icon-file"></i>
<span>选择需求计划运输车辆、吊车类型</span>
</div>
<!-- 搜索区域 -->
<div class="search-card">
<div class="search-form">
<div class="search-inputs">
<input type="text" name="selectName" id="selectName" autocomplete="off" class="layui-input"
lay-affix="clear" placeholder="输入名称" maxlength="30">
<input type="text" name="selectModel" id="selectModel" autocomplete="off" class="layui-input"
lay-affix="clear" placeholder="输入规格" maxlength="30">
</div>
<div class="search-btns">
<button class="layui-btn layui-btn-primary" onclick="querySelectTable(2)">
<i class="layui-icon layui-icon-refresh"></i> 重置
</button>
<button class="layui-btn layui-bg-blue" onclick="querySelectTable(1)">
<i class="layui-icon layui-icon-search"></i> 查询
</button>
</div>
</div>
</div>
<!-- 列表区域 -->
<div class="list-container" id="selectListContainer">
<!-- 列表项将通过JS动态生成 -->
</div>
<!-- 分页区域 -->
<div class="pagination-box" id="selectPaginationBox" style="display: none;">
<button class="layui-btn layui-btn-primary" id="selectPrevPage" onclick="selectPrevPage()">上一页</button>
<span class="page-info" id="selectPageInfo">1/1</span>
<button class="layui-btn layui-btn-primary" id="selectNextPage" onclick="selectNextPage()">下一页</button>
</div>
</div>
<!-- 底部按钮 -->
<div class="btn-box">
<button class="layui-btn layui-btn-primary cancel" onclick="closeSelectTypePage()">取消</button>
<button class="layui-btn layui-bg-blue confirm" onclick="confirmSelectType()">确认</button>
</div>
</div>
<!-- 固定在底部的提交按钮 -->
<div class="fixed-submit-btn">
<button class="layui-btn layui-bg-blue submit-btn-full" onclick="submitApply()">
<i class="layui-icon layui-icon-submit"></i>
<span>确认提交</span>
</button>
</div>
<script src="../../../../lib/jquery-3.4.1/jquery-3.7.1.min.js" charset="utf-8"></script>
<script src="../../../../js/public.js" charset="utf-8"></script>
<script src="../../../../lib/layui-v2.9.18/layui/layui.js" charset="utf-8"></script>
<script src="../../../../js/car_demand_plan/H5/demand_plan_apply..js" charset="utf-8"></script>
</body>
</html>

View File

@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>选择需求计划运输车辆、吊车类型</title>
<link rel="stylesheet" href="../../../../lib/layui-v2.9.18/layui/css/layui.css" media="all">
<link rel="stylesheet" href="../../../../css/font.css" media="all">
<link rel="stylesheet" href="../../../../css/car_demand_plan/H5/select_type.css" media="all">
</head>
<body>
<!-- 顶部标题栏 -->
<div class="h5-header">
<div class="header-left">
<i class="layui-icon layui-icon-setting"></i>
<span class="header-title">贵送机具管理系统</span>
</div>
<div class="header-right">
<span class="selected-count">已选: <span id="selectedNum">0</span></span>
<button class="return-btn" onclick="closePage()">
<i class="layui-icon layui-icon-left"></i>
<span>返回</span>
</button>
</div>
</div>
<div class="h5-container">
<!-- 页面标题 -->
<div class="page-title">
<i class="layui-icon layui-icon-file"></i>
<span>选择需求计划运输车辆、吊车类型</span>
</div>
<!-- 搜索区域 -->
<div class="search-card">
<div class="search-form">
<div class="search-inputs">
<input type="text" name="name" id="name" autocomplete="off" class="layui-input" lay-affix="clear"
placeholder="输入名称" maxlength="30">
<input type="text" name="model" id="model" autocomplete="off" class="layui-input" lay-affix="clear"
placeholder="输入规格" maxlength="30">
</div>
<div class="search-btns">
<button class="layui-btn layui-btn-primary" onclick="queryTable(2)">
<i class="layui-icon layui-icon-refresh"></i> 重置
</button>
<button class="layui-btn layui-bg-blue" onclick="queryTable(1)">
<i class="layui-icon layui-icon-search"></i> 查询
</button>
</div>
</div>
</div>
<!-- 列表区域 -->
<div class="list-container" id="listContainer">
<!-- 列表项将通过JS动态生成 -->
</div>
<!-- 分页区域 -->
<div class="pagination-box" id="paginationBox" style="display: none;">
<button class="layui-btn layui-btn-primary" id="prevPage" onclick="prevPage()">上一页</button>
<span class="page-info" id="pageInfo">1/1</span>
<button class="layui-btn layui-btn-primary" id="nextPage" onclick="nextPage()">下一页</button>
</div>
</div>
<!-- 底部按钮 -->
<div class="btn-box">
<button class="layui-btn layui-btn-primary cancel" onclick="closePage()">取消</button>
<button class="layui-btn layui-bg-blue confirm" onclick="saveData2()">确认</button>
</div>
<script src="../../../../lib/jquery-3.4.1/jquery-3.7.1.min.js" charset="utf-8"></script>
<script src="../../../../js/public.js" charset="utf-8"></script>
<script src="../../../../lib/layui-v2.9.18/layui/layui.js" charset="utf-8"></script>
<script src="../../../../js/car_demand_plan/H5/select_type.js" charset="utf-8"></script>
</body>
</html>

BIN
page/images/delete_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
page/images/docx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 B

BIN
page/images/pdf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 681 B

BIN
page/images/xlsx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 B