订单录入

This commit is contained in:
hant 2025-03-01 14:34:29 +08:00
parent 5e17d3025b
commit 43691f78ef
5 changed files with 356 additions and 78 deletions

View File

@ -0,0 +1,30 @@
<?php
namespace app\admin\controller;
use app\common\controller\Backend;
/**
* 订单列管理
*
* @icon fa fa-circle-o
*/
class Area extends Backend
{
protected $noNeedLogin = ['search'];
public function search(){
$keyword = request()->get('keyword');
if (!$keyword){
$this->success(data:[]);
}else{
$data = model('area')
->where('merge_name','like','%'.$keyword.'%')
->where('level','=',3)
->field('area_code, merge_name')
->limit(0,10)
->select();
$this->success(data:$data);
}
}
}

View File

@ -73,7 +73,6 @@ class Order extends Backend
if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
$params[$this->dataLimitField] = $this->auth->id;
}
dd($params);
$result = false;
Db::startTrans();
try {
@ -83,6 +82,12 @@ class Order extends Backend
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
$this->model->validateFailException()->validate($validate);
}
$params['enter_admin_id'] = $this->auth->id;
$params['status'] = 10;
$params['order_no'] = $this->generateOrderNumber();
$result = $this->model->allowField(true)->save($params);
Db::commit();
} catch (ValidateException|PDOException|Exception $e) {
@ -94,4 +99,16 @@ class Order extends Backend
}
$this->success();
}
function generateOrderNumber($prefix = 'ORD') {
// 获取当前时间戳(精确到毫秒)
$timestamp = microtime(true);
$date = date('YmdHis', (int)$timestamp); // 格式YYYYMMDDHHMMSS
$randomNum = strtoupper(substr(md5($timestamp), 0, 4)); // 从时间戳生成一个随机字符串,取前四个字符
// 组合生成的订单编号
$orderNumber = $prefix . $date . $randomNum;
return $orderNumber;
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace app\admin\model;
use think\Model;
class Area extends Model
{
// 表名
protected $name = 'areas';
}

View File

@ -1,4 +1,13 @@
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="full-height">
<div class="overlay"></div> <!-- 遮罩层 -->
<div class="content">
<!-- 表单区域占2/3 -->
<div class="form-area">
<div class="w-75">
<div class="card-body">
<h5 class="card-title">录入订单</h5>
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Customer')}:</label>
@ -9,25 +18,19 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Tel')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tel" data-rule="required" class="form-control" name="row[tel]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="radio">
{foreach name="statusList" item="vo"}
<label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="10"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
<input id="c-tel" data-rule="required" class="form-control" name="row[tel]" type="number">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label>
<div class='col-xs-12 col-sm-8'>
<input id="c-area_id" class="form-control" data-toggle="city-picker" name="row[area_id]" type="text" value="" />
<input id="c-area_id" class="form-control" type="text" value="" />
<!-- 选项下拉框 -->
<ul id="address-list" class="dropdown-menu" style="display: none;"></ul>
<!-- 存储选择的 area_code -->
<input type="hidden" id="selected-area-code" name="row[area_id]">
</div>
</div>
<div class="form-group">
@ -46,18 +49,25 @@
<label class="control-label col-xs-12 col-sm-2">{:__('Service_title')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-service_title" data-rule="required" class="form-control" name="row[service_title]" type="text" value="">
<!-- 选项下拉框 -->
<ul id="service-list" class="dropdown-menu" style="display: none;"></ul>
<!-- 存储选择的 area_code -->
<input type="hidden" id="selected-service_id" name="row[service_id]">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Detail')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-detail" class="form-control" name="row[detail]" type="text">
<textarea id="c-detail" rows="4" style="width: 100%;resize: vertical" class="form-control" name="row[detail]"></textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-remark" class="form-control" name="row[remark]" type="text">
<textarea id="c-remark" rows="4" style="width: 100%;resize: vertical" class="form-control" name="row[remark]" ></textarea>
</div>
</div>
<div class="form-group">
@ -77,7 +87,84 @@
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
<button type="submit" class="btn btn-primary btn-embossed disabled">录入</button>
</div>
</div>
</form>
</form>
</div>
</div>
</div>
<!-- 功能区占1/3 -->
<div class="function-area ">
<h5 class="text-center">快速输入</h5>
<div class="form-floating">
<textarea rows="8" style="width: 100%;resize: vertical" class="form-control" placeholder="复制内容,快速输入" id="floatingTextarea"></textarea>
</div>
</div>
</div>
</div>
<script>
</script>
<style>
.full-height {
height: 100vh;
width: 100vw;
background: #fff;
}
.overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.3); /* 背景黑色遮罩 */
z-index: -1;
}
.card {
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.card-body {
padding: 2rem;
}
.content {
display: flex;
height: 100vh;
}
.form-area {
flex: 2;
display: flex;
justify-content: center;
align-items: flex-start;
}
.function-area {
flex: 1;
padding: 2rem;
background-color: #f8f9fa;
/*border-left: 1px solid #ddd;*/
}
.dropdown-menu {
position: absolute;
z-index: 1000;
width: 100%;
max-height: 300px;
overflow-y: auto;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2);
margin: 6px 12px;
}
.dropdown-item {
padding: 8px;
cursor: pointer;
}
.suggestion-item:hover {
background-color: #f0f0f0;
}
</style>

View File

@ -83,5 +83,134 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
}
}
};
function parseAndFill() {
// 获取左侧输入框的内容
}
let $input = $("#c-area_id");
let $dropdown = $("#address-list");
let $hiddenField = $("#selected-area-code");
let timer = null; // 定义定时器
// 监听输入框
$input.on("input", function () {
clearTimeout(timer); // 清除上次的定时器
let keyword = $(this).val().trim();
if (keyword.length === 0) {
$dropdown.hide();
return;
}
// 延迟 500 毫秒后执行 AJAX 查询(防止过快触发)
timer = setTimeout(() => {
$.ajax({
url: "/admin/area/search", // 你的 API 地址
type: "GET",
data: { keyword: keyword },
dataType: "json",
success: function (data) {
renderDropdown(data.data);
},
error: function () {
console.error("请求失败");
}
});
}, 200); // 500 毫秒防抖
});
// 渲染城市下拉选项
function renderDropdown(data) {
$dropdown.empty(); // 清空列表
if (data.length === 0){
let $option = $("<li class='dropdown-item'></li>")
.text('未搜索到结果')
.attr("data-value", 0);
$dropdown.append($option);
}else{
data.forEach(item => {
let $option = $("<li class='dropdown-item'></li>")
.text(item.merge_name)
.attr("data-value", item.area_code) // 绑定 area_code
.on("click", function () {
$input.val(item.merge_name); // 选中后填充输入框
$hiddenField.val($(this).attr("data-value")); // 存储 area_code
$dropdown.hide();
});
$dropdown.append($option);
});
}
$dropdown.show(); // 显示下拉框
}
let $inputService = $("#c-service_title");
let $dropdownService = $("#service-list");
let $hiddenFieldService = $("#c-service_id");
let timerService = null; // 定义定时器
$inputService.on("input", function () {
clearTimeout(timerService); // 清除上次的定时器
let keyword = $(this).val().trim();
if (keyword.length === 0) {
$dropdown.hide();
return;
}
// 延迟 500 毫秒后执行 AJAX 查询(防止过快触发)
timerService = setTimeout(() => {
$.ajax({
url: "/admin/area/search", // 你的 API 地址
type: "GET",
data: { keyword: keyword },
dataType: "json",
success: function (data) {
renderDropdownService(data.data);
},
error: function () {
console.error("请求失败");
}
});
}, 200); // 500 毫秒防抖
});
// 渲染城市下拉选项
function renderDropdownService(data) {
$dropdownService.empty(); // 清空列表
if (data.length === 0){
let $option = $("<li class='dropdown-item'></li>")
.text('未搜索到结果')
.attr("data-value", 0);
$dropdownService.append($option);
}else{
data.forEach(item => {
let $option = $("<li class='dropdown-item'></li>")
.text(item.merge_name)
.attr("data-value", item.area_code) // 绑定 area_code
.on("click", function () {
$inputService.val(item.merge_name); // 选中后填充输入框
$hiddenFieldService.val($(this).attr("data-value")); // 存储 area_code
$dropdownService.hide();
});
$dropdownService.append($option);
});
}
$dropdownService.show(); // 显示下拉框
}
// 点击外部隐藏下拉框
$(document).on("click", function (e) {
if (!$(e.target).closest("#c-address, #address-list").length) {
$dropdown.hide();
}
});
return Controller;
});